如何在windows10下使用vs2017编译最新版本的FFmpeg和ffplay

前言:

该文章描述了如何在windows10 64位系统下面编译出FFmpeg的库及其自带的ffplay播放器,而且全部采用最新的版本,这样我们可以在vs2017的ide下调试ffplay,能使我们更容易学习FFmpeg的架构以及音视频播放器的原理。

步骤:

1.安装vs2017

https://visualstudio.microsoft.com/zh-hans/downloads/下载vs2017的社区版,执行安装程序后进入下面界面,选择如图所示的几个项目安装就行了。安装后可得到msvc的交叉编译环境,该toolchain用于在msys2下编译FFmpeg。我这里的安装路径是"C:\Program Files (x86)\Microsoft Visual Studio"

2.安装msys2

http://www.msys2.org/下载msys2,如下图所示,因为我是64位的系统,所以选择 msys2-x86_64-20180531.exe进行安装下载。

3.下载ffmpeg源码和SDL2源码

http://ffmpeg.org/download.html下载最新的FFmpeg代码,我是使用git直接clone下最新的FFmpeg的源码到本地的,当然也可以选择直接下载打包好的源码。我的FFmpeg的源码目录是D:\git\FFmpeg。

http://www.libsdl.org/download-2.0.php下载SDL2的源码,我选择的源码的zip包下载的,也就是SDL2-2.0.9.zip。我将其解压到D盘,目录是D:\SDL2-2.0.9

4.编译SDL2生成SDL2的静态库和动态库

启动vs2017,导入D:\SDL2-2.0.9\VisualC下的解决方案,原解决方案是vs2010下的,导入过程中会升级到最新的平台工具集。然后我们点击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\2017\Community\VC\Auxiliary\Build\vcvars32.bat"

该命令表示加载vs2017的32位交叉编译环境,如果要编译64位的库则执行vcvars64.bat,也就是

call "C:\Program Files (x86)\Microsoft Visual Studio\2017\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目录下放的是头文件,这两个目录下的东西都是我们在vs2017环境下编译ffplay需要的。

7.在vs2017下编译ffplay

打开vs2017选择文件,新建项目,选择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并不复杂,编译好的库可以正常在vs2017下调用,我们可以方便的使用这些库开发windows下的音视频播放器。

编译重点在于选择和正确配置编译环境,32位和64位的库要选择相对应的编译环境,另外由于windows环境是gbk编码,而FFmpeg是utf8编码,所以编译过程中可能遇到这方面问题,具体情况需要具体分析。

特别纪念雷霄骅博士,我就是在他的文章的指导下了解了很多关于FFmpeg的知识,希望他在天堂安好。

猜你喜欢

转载自blog.csdn.net/apple7732/article/details/87980750