如何在win10下使用vs2019编译FFMpeg库文件以及ffplay.exe、ffmpeg.exe和ffprob.exe
简单介绍
这里在win10的64位系统中编译了最新的ffmpeg的库文件及它自带的工具ffplay、ffmpeg和ffprob程序,代码全部采用最新版本。这样编译后我们可以使用vs2019的IDE下直接进行调试ffmpeg工具软件,使学习ffmpeg的架构及音视频播放器原理更加容易。官方指导文档可参看Platform Specific Information页面。
方法步骤
- 安装VS2019
首先进入VS官网下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 下载VS2019程序文件,执行安装程序进行安装。安装后可以得到msvc的交叉编译环境,该toolchain用于在msys2下编译ffmpeg。
以社区版VS2019为例,下载后会得到文件vs_community.exe,如果想进行离线安装需使用命令行运行vs_community.exe --layout c:\vslayout --lang zh-CN,基中layout参数后为要下载安装包的放置文件夹,lang参数后为要下载程序的语言版本,下载完成后进入设置的安装包文件夹下运行安装,如c:\vslayout\vs_community.exe。
- 安装msys2
在MSYS2上下载msys2,安照网站上的步骤安装完成。安装路径最好不要有中文或空格,避免以后使用出现编码问题。安装后运行安装目录的msys2_shell.cmd,输入指令,其中#号为注释可不添:
-Syu
#更新核心依赖包
pacman -Su
#通过pkgconf安装通用msys2的 packages软件包
pacman -S make pkgconf diffutils
#安装mingw的packages软件包和toolchains工具组件
# 下面这个是64位版本
# pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2
# 下面这个是32位版本
pacman -S mingw-w64-i686-nasm mingw-w64-i686-gcc mingw-w64-i686-SDL2
- 下载ffmpeg源码及SDL(ffplay是基于它显示的)库文件
在http://ffmpeg.org/download.html上下载ffmpeg源码。解压的ffmpeg源码文件夹放置msys2目录下的home文件夹中。
在http://www.libsdl.org/download-2.0.php下载SDL2开发用库文件。下载后解压待用。
SDL2的目录结构,其中dll和lib在lib文件夹中,头文件在include文件夹中,编译ffplay时需要。
- 启动msys2 编译环境
进入msys2安装路径,在其中创建msys_vs2019.bat批处理文件。编辑文件内容:
set MSYS2_PATH_TYPE=inherit
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat"
msys2_shell.cmd -mingw64
其中call后面为自己的vs安装路径,如果想编译64位库需要把vcvars32.bat改为vcvars64.bat文件。
在msys2安装路径找到msys2\usr\bin\link.exe文件改下文件名,因为会和vc的link.exe重名。完成后双击msys_vs2019.bat启动msys2。
如果编译器显示乱码在msys2环境右键点击options设置下text的编码为gbk与window系统编码保持一致。
- 使ffmpeg可使用x264编码
进入x264, the best H.264/AVC encoder - VideoLAN 下载x264编码源码。
把解压的x264文件夹放至msys2的home目录中,启动后使用cd ../x264命令进入文件夹。
gcc 编译libx264 (.a .dll)
运行mingw32.exe
开始设置编译方式:
./configure --prefix=./vs2019_x86_build --host=mingw32 --enable-shared --enable-static --extra-ldflags=-Wl,--output-def=libx264.def
参数说明:
--enable-static 编译静态库
--enable-shared 编译动态库
--extra-ldflags=-Wl,--output-def=libx264.def 生成def文件
--host=mingw32 指定编译器,该项必填
--prefix=./vs2019_x86_build 生成文件位置
执行编译命令
make -j4
参数说明:j4为使用4核处理,该参数可不写将使用默认方式编译
编译完成后执行最后的生成
make install
以上编译完成后会生成def、 dll及.a文件。
#复制def文件至输出lib文件夹中
cp ./libx264.def ./vs2019_x86_build/lib/
#进入lib文件夹
cd vs2019_x86_build/lib/
#若要生成64位lib文件则输入如下命令:
#lib /machine:X64 /def:libx264.def
#若要生成32位lib文件则输入如下命令:
lib /machine:i386 /def:libx264.def
执行后得到libx264.lib,然后将vs2019_x86_build/bin文件夹中的libx264-XXX.dll改名或者复制一份为libx264.dll。
msvc编译libx264(.lib .dll)
在msys2中输入代码进行编译,输入代码设置编译:
CC=cl ./configure --enable-static --enable-shared --prefix=./vs2019_x86_build
参数说明:CC=cl 使用VS方式编译
开始编译
make -j4
安装编译
make install
要用生成的lib编译ffmpeg要使用动态x264库,需要将vs2019_x86_build/lib中的libx264.dll.lib改名为libx264.lib,本身的静态的libx264.lib可改名、删掉或放置其它地方。
- 编译ffmpeg的静态库和动态库
使用msys2进入ffmpe源码目录,我放在msys2的home中ffmpeg文件夹中进入指令如下:
cd ../ffmpeg
开始设置编译方式:
./configure --enable-shared --enable-static --toolchain=msvc --prefix=./vs2019_x32 --enable-postproc --enable-gpl --enable-avresample --enable-libx264 --extra-cflags=-I/home/x264/vs2019_x86_build/include --extra-ldflags=-LIBPATH:/home/x264/vs2019_x86_build/lib
参数说明:
--toolchain=msvc 指定VS为工具组件
-enable-postproc --enable-gpl --enable-avresample 需要集成的功能
--enable-libx264 集成h264编码
--extra-cflags=-I/home/x264/vs2019_x86_build/include 指定h264头文件位置
--extra-ldflags=-LIBPATH:/home/x264/vs2019_x86_build/lib 指定h264库文件位置
该命令执行会有一些等待时间,过会后将会出现配置过程数据显示,直到全部配置完成。
完成后查看ffmpeg\config.h和ffmpeg\ffbuild\config.mak这两个文件编码是否为utf8,如果不是要对其转换成utf8编码。
转换完成保存后执行编译命令
make -j4
编译完成后执行最后的生成
make install
全部执行完成后进入输出指定文件夹,这里是vs2019_x32,可以看到如下文件,这些就是编译好的全部ffmpeg的静态库和动态库。
其中bin里面为lib和dll文件,lib文件夹中是def文件,include文件夹为头文件,share是一些预设和示例。
- 使用VS2019编译ffplay
打开vs2019创建新的空项目
把ffmpeg源码中的config.h文件和fftools文件夹中的ffplay.c,cmdutils.c,cmdutils.h三个文件都复制到到vs新建项目中,修改config.h文件编码为GBK编码并在其中有中文的地方前加上u8符号,保证显示不会乱码。
添上以上四个文件至VS创建的ffplay项目中。
完成后把ffmpeg编译好的库和SDL2的库头文件及库文件目录添加进项目。
拷贝ffmpeg和sdl中的所有dll文件至项目路径下
然后把所有的依赖项lib配置进项目。
项目需保持Unicode字符集
常规SDL检查改为否
屏蔽两个出错的头文件
打包编译即可完成。
添加要使用的命令参数,便可开始运行跟踪调试。
- 使用VS2019编译ffprobe
仿照编译ffplay的方法,使用vs2019创建一个空的项目,加入ffmpeg源码中的config.h及fftools目录下的cmdutilsc,cmdutils.h,ffprobe.c这四个文件。设置头文件目录及lib目录,加入依赖lib库文件。具体方法参照ffplay进行设置,这里不需要SDL2库了,可以去除,其它设置都是一样的。
屏蔽掉报错的头文件,设置config.h线程HAVE_THREADS值从1改为0。保存后编译即可通过。
- 使用VS2019编译ffmpeg
仿照编译ffprobe的方法,创建一个空的项目,按之前方法设置项目属性,最后加入ffmpeg源码中的config.h和fftools目录下的cmdutilsc,cmdutils.h,ffmpeg.c,ffmpeg.h,ffmpeg_filter.c,ffmpeg_hw.c,ffmpeg_opt.c以及ffmpeg源码中目录下的compat\atomics\win32\stdatomic.h,共九个文件。
config.h和cmdutils.h这两个文件和ffprobe一样的修改方式。
打开ffmpeg.h屏蔽线程头文件。
接下来修改ffmpeg.c文件,首先打开文件,屏蔽指定头文件
修改本地加载stdatomic.h,把<>符号改为””号。
然后在这里加入如下代码
具体代码可进入对应的头文件中找到。
修改完成后进行编译,成功后就可以使用了。
因集成了x264编码,需要将x264.dll文件也放进来。