该文章描述了如何在windows10 64位系统下面编译出FFmpeg的库及其自带的ffplay播放器,而且全部采用最新的版本,这样我们可以在vs的ide下调试ffplay,能使我们更容易学习FFmpeg的架构以及音视频播放器的原理。
步骤:
1.安装vs
在/zh-hans/downloads/下载vs的社区版,执行安装程序后进入下面界面,选择如图所示的几个项目安装就行了。安装后可得到msvc的交叉编译环境,该toolchain用于在msys2下编译FFmpeg。我这里的安装路径是"C:\Program Files (x86)\Microsoft Visual Studio"
2.安装msys2
在/下载msys2,如下图所示,因为我是64位的系统,所以选择 msys2-x86_64-0531.exe进行安装下载。
3.下载ffmpeg源码和SDL2源码
在/download.html下载最新的FFmpeg代码,我是使用git直接clone下最新的FFmpeg的源码到本地的,当然也可以选择直接下载打包好的源码。我的FFmpeg的源码目录是D:\git\FFmpeg。
在/download-2.0.php下载SDL2的源码,我选择的源码的zip包下载的,也就是SDL2-2.0.9.zip。我将其解压到D盘,目录是D:\SDL2-2.0.9
4.编译SDL2生成SDL2的静态库和动态库
启动vs,导入D:\SDL2-2.0.9\VisualC下的解决方案,原解决方案是vs下的,导入过程中会升级到最新的平台工具集。然后我们点击SDL2和SDL2main两个项目进行生成,编译成功后会生成32位的SDL2的静态库和动态库,位置在D:\SDL2-2.0.9\VisualC\Win32下面,其中的SDL2.dll,SDL2.lib,SDL2main.lib三个文件是我们编译ffplay需要的。
上面还只是编译出32位的SDL2的库,如果要64位的库,我们只需将编译环境改成x64后对SDL2和SDL2main两个项目进行生成,成功后的库在D:\SDL2-2.0.9\VisualC\x64\Debug目录下。
上面生成的库是debug的库,如果需要release的库改一下编译选项即可。
5.设置msys2的编译环境
进入msys2的安装路径,我这里的路径是D:\mysys64,编辑该目录下的msys2_shell.cmd文件,在setlocal后加入一行
call "C:\Program Files (x86)\Microsoft Visual Studio\\Community\VC\Auxiliary\Build\vcvars32.bat"
该命令表示加载vs的32位交叉编译环境,如果要编译64位的库则执行vcvars64.bat,也就是
call "C:\Program Files (x86)\Microsoft Visual Studio\\Community\VC\Auxiliary\Build\vcvars64.bat"
6.编译FFmpeg的静态库和动态库
在步骤5设置好msys2的环境后执行msys2_shell.cmd,进入msys2的命令行模式,windows系统默认是gbk编码,编译过程中可能出现乱码,需要修改该窗口的text为gbk编码,右键点击窗口选择Options,再选择Text,修改编码为gbk,如下图所示
进入FFmpeg的源码目录进行编译,我这里是D:\git\FFmpeg,FFmpeg的配置如下,其中--prefix=x32中的x32表示编译好后的安装目录,编译成功后执行make install会放在FFmpeg目录下的x32文件夹里面。
cd /d/git/FFmpeg
./configure --enable-shared --enable-static --toolchain=msvc --prefix=x32 --enable-postproc --enable-gpl --enable-avresample
执行./configure命令后等待比较长时间直到回到命令行提示符
由于windows10系统默认是gbk编码,而我们FFmpeg的源码都是utf8编码,编译时候如果代码里面有中文,就会产生问题,有2个文件里面带有中文,我们需要将其转换为utf8编码,一个是D:\git\FFmpeg\config.h,另外一个是D:\git\FFmpeg\ffbuild\config.mak。
转换完成以后执行编译命令
make -j4
经过很长时间编译完成后执行
make install
现在我们打开FFmpeg目录下的x32目录,就可以看到编译好的FFmpeg的静态库和动态库
bin目录下放的是静态库和动态库,include目录下放的是头文件,这两个目录下的东西都是我们在vs环境下编译ffplay需要的。
7.在vs下编译ffplay
打开vs选择文件,新建项目,选择visual c++下的Windows桌面,建立一个空项目
开始拷贝文件到ffplay目录下,我这里SDL的目录是D:\SDL2-2.0.9\VisualC\Win32,FFmpeg的目录是D:\git\FFmpeg。在D:\ffplay\ffplay目录下新建一个文件夹lib用于放ffmpeg静态库和sdl2的静态库。
拷贝D:\git\FFmpeg\下的config.h文件到D:\ffplay\ffplay目录
拷贝D:\git\FFmpeg\fftools下的ffplay.c,cmdutils.c,cmdutils.h三个文件到D:\ffplay\ffplay目录
拷贝D:\git\FFmpeg\x32下的include文件夹到D:\ffplay\ffplay目录下,如果是64位的,则从D:\git\FFmpeg\x64下拷贝。
拷贝D:\git\FFmpeg\x32\bin下的所有扩展名为lib的文件到D:\ffplay\ffplay\lib下面,拷贝D:\git\FFmpeg\x32\bin下的所有扩展名为dll的文件到D:\ffplay\ffplay下面。如果是64位的,则从D:\git\FFmpeg\x64\bin文件夹拷贝。
拷贝D:\SDL2-2.0.9\VisualC\Win32\Debug下的SDL2.lib,SDL2main.lib到D:\ffplay\ffplay\lib下面,拷贝D:\SDL2-2.0.9\VisualC\Win32\Debug下的SDL2.dll到D:\ffplay\ffplay下面。如果是64位的,则从D:\SDL2-2.0.9\VisualC\x64\Debug文件夹下拷贝。
在D:\ffplay\ffplay\include目录下新建一个文件夹SDL2,拷贝D:\SDL2-2.0.9\include下的全部头文件到D:\ffplay\ffplay\include\SDL2目录下。
现在文件拷贝完毕,开始配置ffplay项目的属性。
右键点击ffplay下的源文件,选择添加-》现有项,把D:\ffplay\ffplay目录下的cmdutils.c和ffplay.c加进来。如下图所示
右键点击ffplay下的头文件,选择添加-》现有项,把D:\ffplay\ffplay目录下的cmdutils.h和config.h加进来。
右键点击ffplay,选择属性,配置属性下的常规,项目默认的字符集改成使用Unicode字符集,如下图所示
VC++目录下库目录加上lib,如下图所示
C/C++下的常规中,附加包含目录改成include,另外SDL检查改成否,如下图所示
链接器下的输入中的附加依赖项改成
avcodec.lib;avformat.lib;avutil.lib;avdevice.lib;avfilter.lib;postproc.lib;swresample.lib;swscale.lib;SDL2.lib;SDL2main.lib;avresample.lib;%(AdditionalDependencies)如下图所示
右键点击ffplay项目,选择重新扫描方案,然后开始编译
编译遇到错误,找不到三个头文件,注释掉就可以了,如下图所示,注释掉ffplay.c中这三个出错的头文件引用就可以了
现在ffplay已经可以编译通过了,可以测试一下能否正常工作,选择ffplay属性页中的调试,将命令参数设置需要播放的音视频文件地址,就可以了,记得命令参数要空格开头,不同参数之前用空格隔开
点击本地windows调试器开始运行ffplay
总结:
在windows环境下编译FFmpeg和ffplay并不复杂,编译好的库可以正常在vs下调用,我们可以方便的使用这些库开发windows下的音视频播放器。
编译重点在于选择和正确配置编译环境,32位和64位的库要选择相对应的编译环境,另外由于windows环境是gbk编码,而FFmpeg是utf8编码,所以编译过程中可能遇到这方面问题,具体情况需要具体分析。
特别纪念雷霄骅博士,我就是在他的文章的指导下了解了很多关于FFmpeg的知识,希望他在天堂安好。