FFMPEG环境搭建
一、FFMPEG获取:
这里以Windows版为例,我们前期的例子都是直接在Windows上进行的,因此直接下载Windows版本的,其他系统的先不管他。
下载地址:
https://ffmpeg.zeranoe.com/builds/
打开后可看到如下界面:
其中 Static 顾名思义就是静态库版本了。
Shared则是动态库版本。
Dev则是提供给开发者用的Lib文件。
FFMPEG最新版已经是3了。
不过我们用的还是2.5的,当然也可以用其他的,如2.8。基本上版本2的API都是没差的,因此对开发没有影响。
首先下载Dev库,点击Previous FFmpeg 32-bit Dev Versions 。
找到2.5版本的 点击下载:
二、在工程中引用FFMPEG
打开我们前面搭建好的Qt Creator。新建一个工程,随便都行,就选纯C++工程吧:
切记:名字和路径一定不能有中文。
我的工程是放在 :E:MyProjectsVideoDevelop 目录下
解压出刚才下载的ffmpeg,解压后的目录名字是ffmpeg-2.5.2-win32-dev
改名成ffmpeg,并且只留下include和lib这2个文件夹,其他都删了。
将ffmpeg直接复制到我们的工程目录下:
Qt Creator中修改工程配置文件 testFFmpeg.pro:
在里面加入:
INCLUDEPATH += $$PWD/ffmpeg/include
LIBS += $$PWD/ffmpeg/lib/avcodec.lib
$$PWD/ffmpeg/lib/avdevice.lib
$$PWD/ffmpeg/lib/avfilter.lib
$$PWD/ffmpeg/lib/avformat.lib
$$PWD/ffmpeg/lib/avutil.lib
$$PWD/ffmpeg/lib/postproc.lib
$$PWD/ffmpeg/lib/swresample.lib
$$PWD/ffmpeg/lib/swscale.lib
这就是引用ffmpeg的头文件和库的意思,如下所示:
mian.cpp写成如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <iostream> using namespace std;
extern "C"
{ #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include "libavdevice/avdevice.h" } ///由于我们建立的是C++的工程 ///编译的时候使用的C++的编译器编译 ///而FFMPEG是C的库 ///因此这里需要加上extern "C" ///否则会提示各种未定义 int main()
{ //这里简单的输出一个版本号
cout << "Hello FFmpeg!" << endl;
av_register_all();
unsigned version = avcodec_version();
cout << "version is:" << version;
return 0;
} |
好了点击左下角的绿色按钮编译吧:
不一会儿便看到了二个错误:
看到错误的时候,莫方,2个而已嘛,不防先看看是啥错误吧。
先双击第一个错误:
跳到了common.h:
#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C)
#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
#endif
看不懂什么鬼意思,总之他的意思就是什么东西没定义了,那就按他的要求定义一下吧:
修改main.cpp
在包含ffmpeg头文件的前面加上:
#define __STDC_CONSTANT_MACROS
如下图所示:
当然也可以直接在common.h的开头处加上#define __STDC_CONSTANT_MACROS
我习惯的是后者,这样改完以后就直接复制改好的文件就行了,一劳永逸。
好了继续编译,这时候错误变成一个了,继续双击错误。
还是跳到了common.h。
这个文件还真是多事。
提示UINT64_C未声明,那就给他声明一下吧:
在common.h文件开头处加入
1
2
3
4
|
#ifndef INT64_C #define INT64_C(c) (c ## LL) #define UINT64_C(c) (c ## ULL) #endif |
修改后的完整文件如下:
别忘了按CTRL+S.
好了,再次编译运行吧。
本以为结束了。
运行发现问题又来了:
只有一个黑框,我们上面写的那些信息并没有打印出来。
首先打开工程目录,会发现同目录下多了一个文件夹:build-testFFmpeg-Qt_4_8_2_mingw-Debug
打开它,我们生成的exe文件就在build-testFFmpeg-Qt_4_8_2_mingw-Debug/debug/testFFmpeg.exe
直接双击运行看看到底是什么情况。
双击运行之后就有提示了,提示缺少dll文件:
原来忘记把ffmpeg的dll文件放到里面了。
我们刚刚只是下载了Dev包,这里面只有LIB文件,Lib文件是编译连接的时候需要用到的。
而运行的时候需要DLL,因此继续下载FFMPEG的Shared版本
找到2.5的,下载下来。
一定要和刚才下载的版本一致,否则是没法运行的:
解压出 ffmpeg-2.5.2-win32-shared.7z
打开会看到一个bin目录,里面都是dll文件,这些就是运行时需要的动态库,
将这些dll复制到,刚才我们生成exe的目录下(要和exe放在一起)
现在重新打开Qt Creator,运行,这次终于对了,出现了版本信息:
至此,就成功了引用了FFMPEG了。