zoukankan      html  css  js  c++  java
  • windows环境下搭建ffmpeg开发环境

           ffmpeg是一个开源、跨平台的程序库,能够使用在windows、linux等平台下,本文将简单解说windows环境下ffmpeg开发环境搭建过程,本人使用的操作系统为windows 7。集成开发环境为Visual Studio 2005,ffmpeg版本号为2.2。有人可能会说都什么年代了,还VS 2005。如今VS 2010/2012/2013都出了。本人电脑也安装了VS2010,每次打开。伴随着硬盘指示灯的闪烁。以及硬盘的吱吱响声,过了许久才弹出闪屏页面,此时你的思绪可能已经飘到了南极。启动一次实在太慢了。全然老牛拉车的感觉,所以兴许VS2012/2013就都没有再安装使用了。

    个人认为VS2005/2008比較锐,相对轻巧些,启动速度快,当然非常多快捷键用着也习惯了。

           以下从一个很easy的ffmpeg样例着手。讲一下开发环境搭建过程:
           1. 打开VS编辑器,新建一个win 32 c++控制台应用程序。
           2. 进入ffmpeg源代码下的doc/examples目录。找到metadata.c文件。该文件是一个独立demo。执行结果为打印音视频媒体文件基本信息。该文件体积还不到2k,代码行数在这几个demo里最少,看起来也easy懂。

    下图为metadata.c文件源代码。打开该文件,拷贝里面的代码到我们新建的win 32project,此时假设尝试编译上述代码时。编译器会报各种各样的错误,主要错误原因还是ffmpeg在windows环境下的各种水土不服。在linux环境下好非常多。没有这么多的什么数据类型不识别、宏定义缺失等等错误,以下依据错误类型,设置project并改动上述代码,以完毕正确编译。

                       
           (1)设置project头文件及lib库依赖。

    ffmpeg的头文件和lib库能够自己编译得到,只是本人没有尝试。而是直接到这里下载了已编译好的ffmpeg windows相关版本号,解压后得到下述文件:

                                                 

                                                 
           拷贝当中的include头文件、lib库文件以及bin文件夹下的dll文件到自己的project下,然后在project属性中设置附加包括文件夹:$(ProjectDir)include和附加库文件夹:$(ProjectDir)lib这个设置非常easy了。此时project文件夹例如以下图所看到的:
                                                 
           (2)此时编译project会有例如以下图所看到的错误。解决方法就是定位到该错误。直接将其凝视就可以。

                                                 
           (3)再次编译project,会有例如以下图所看到的错误:
                                                 
    定位错误后发现还是common.h头文件有问题,解决方法为在刚才凝视的以下,新增下述代码:
    #ifndef INT64_C
    #define INT64_C(c)  (c ## LL)
    #define UINT64_C(c) (c ## ULL)
    #endif
           (4)假设此时再次编译project,还是会有错误,错误原因是我们新建的win 32 c++project直接调用ffmpeg的c函数库,导致c函数无法解析。对于这样因为c++和c函数名编译后命名机制不同导致无法解析的问题。仅仅需在引用c函数库时加入extern "C"就可以,当然还有引用lib库。改动后的代码例如以下:
    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    extern "C"
    {
        #include <libavformat/avformat.h>
        #include <libavutil/dict.h>
    }
    
    #pragma comment(lib, "avformat.lib")
    #pragma comment(lib, "avutil.lib")
    
    int main ()
    {
        AVFormatContext *fmt_ctx = NULL;
        AVDictionaryEntry *tag = NULL;
        int ret = 0;
    
        av_register_all();
        if ((ret = avformat_open_input(&fmt_ctx, "iphone.mp3", NULL, NULL)))
    	{
            return ret;
    	}
    
        while ((tag = av_dict_get(fmt_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX)))
    	{
            printf("%s=%s
    ", tag->key, tag->value);
    	}
    
        avformat_close_input(&fmt_ctx);
    
    	system("pause");
        return 0;
    }
    此时能够顺利编译通过了,执行结果例如以下:
                                          
           当然,随着开发的深入,在使用uint8_t、int64_t等数据类型时,编译器会报例如以下错误:fatal error C1083: Cannot open include file: 'stdint.h': No such file or directory,即找不到相关头文件。该头文件的压缩包能够在我上传的project文件文件夹内找到。解压缩后将两个头文件拷贝至Microsoft Visual Studio 8/vc/include文件夹就可以。


           因为project执行依赖的几个dll体积比較大,所以在上传project时本人将其删掉了,该dll能够到文中提到的链接下载。即:





  • 相关阅读:
    Codeforces Round #401 (Div. 2)解题报告
    ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) 解题报告
    (线段树)hdoj 3308-LCIS
    Codeforces Round #399 (Div. 1 + Div. 2, combined) D题Jon and Orbs(dp)解题报告
    2019 Multi-University Training Contest 1
    2019 Multi-University Training Contest 6
    2019牛客暑期多校训练营(第八场)
    模板
    2019 Multi-University Training Contest 8
    2019 Multi-University Training Contest 9
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5359390.html
Copyright © 2011-2022 走看看