Windows 下 FFmpeg +X264 +x265的编译和配置

工具和源码准备

  1. ffmpeg https://ffmpeg.org/download.h...
  2. libx264 https://www.videolan.org/deve...
  3. libx265 https://www.videolan.org/deve...
  4. MSYS2 官网地址:https://www.msys2.org/
    (MSYS 2.0 提供了 pacman 软件管理器,通过它来安装依赖的软件。msys2不可以安装再FAT*分区。msys2不可以安装再winXP系统上
  5. VS2015
  6. CMAKE
    (a)关于VS版本:VS2010不支持C99,现在很多开源代码(比如x264,ffmpeg)中的C代码都采用c99规范,前vs2010,vs2012都不支持c99规范,从vs2013开始才部分支持c99规范。如果是VS2010编译,需要先采用C99 to C89 转换工具进行预处理)
    (b)VS需要使用英文语言包。否则后面编译ffmpeg会大量报错,命令行 error D8000:cl
编译方式 很多教程用 MinGW 来编译,最后编译出来的静态库是个 .a 的形式。
但是Windows 下的静态库是 .lib,直接用 CMake 去链接 .a 库肯定不行。
需要先把 .a 库转成 .def 文件,然后再把 .def 文件转成 .lib 文件,甚至再把 .lib 文件转成 .dll 的动态库。windows平台下建议用MSVC编译器编译。
启动环境 开始菜单中找到并打开Visual Studio 2015 Command line。
Visual Studio Command line分为32位版本和64位版本。
用32位版本编译的程序就是32位的。用64位版本编译的程序就是64位的。编译出来的exe或者dll可以用dumpbin判断是32位还是64位。
查看32位还是64位:
dumpbin /headers libx264.dll
查看符号清单(导出函数):
dumpbin /exports libx264.dll > libx264-exports.txt
在Visual Studio 2015 Command line命令行终端中,进入到 MSYS 安装目录,打开 msys2_shell.cmd ,如下命令
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>c:/msys64/msys2_shell.cmd -use-full-path

注意-use-full-path的使用。因为在调用msys时如果不添加-use-full-path ,后面在msys2的shell中就会不认cc=cl。即无法在msys中使用MSVC。一下方法是等价的。建议第二种。
  • msys2_shell.cmd 中取消一行的注释:set MSYS2_PATH_TYPE=inherit
  • 调用msys2_shell.cmd时使用-use-full-path参数
  • 在windows系统的环境变量中添加 MSYS2_PATH_TYPE=inherit
MSYS2窗口打开后,先把基本的环境安装好
pacman -Syu pacman -S make pacman -S diffutils pacman -S yasm pacman -S nasm

x264 【Windows 下 FFmpeg +X264 +x265的编译和配置】在该窗口中进入到 LibX264 的源码目录下,把如下代码保存成 .sh 文件并执行:
OPTIONS="--enable-shared --enable-static " BUILD_DIR="./../build32"CC=cl ./configure $OPTIONS --prefix=$BUILD_DIR/make -j 16 make install make clean

注意 configure 命令前缀有个 CC=cl ,代表使用 MSVC 来编译了。
将编译后的 libx264.dll.lib 改成 libx264.lib,这就是静态库了。如果不修改名字,后续FFMPEG编译的时候会提示找不到libx264。
编译完成之后,打开生成路径下/lib/pkgconfig/x264.pc文件。检查一下prefix的路径。建议直接改成绝对路径。pc文件后面编译ffmpeg要用到。
如果要编译
x265 x265采用cmake编译。相比x264而言,其build目录下已经把各个平台的sh文件提供了:
Windows 下 FFmpeg +X264 +x265的编译和配置
文章图片

在msys2窗口中cd进入msys-cl目录,打开make-Makefiles.sh稍作修改如下:
#!/bin/sh # This is to generate visual studio builds with required environment variables set in this shell, useful for ffmpeg integration # Run this from within an MSYS bash shellINSTALL_DIR="./../../../build32/"if cl; then echo else echo "please launch msys from 'visual studio command prompt'" exit 1 ficmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4"../../sourceif [ -e Makefile ] then nmake finmake install

相比默认的sh, 添加如下三行:
INSTALL_DIR="./../../../build32/" -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR nmake install

然后在MSYS2下执行sh make-Makefiles.sh。一键等待即可。
如果要编译64位的x265,把make-Makefiles-64bit.sh作类似修改,从visual studio command line 64位进入,打开msys2, 再执行sh make-Makefiles-64bit.sh即可。
ffmpeg 继续在 MSYS 2.0 窗口中进入到下载好 FFmpeg 的源码目录,将如下代码保存成 .sh 文件并执行:
X264_INSTALL="/d/zsc/VSCODE_CPP_DIR/FFMPEG-H264-TEST/x264-master/build32" X265_INSTALL="/d/zsc/VSCODE_CPP_DIR/FFMPEG-H264-TEST/x265-master/build32"X264_INCLUDE=$X264_INSTALL/include X264_LIB=$X264_INSTALL/lib X264_BIN=$X264_INSTALL/binX265_INCLUDE=$X265_INSTALL/include X265_LIB=$X265_INSTALL/lib X265_BIN=$X265_INSTALL/binexport PATH=$X264_BIN:$PATH export PATH=$X265_BIN:$PATHexport PKG_CONFIG_PATH=$X264_LIB/pkgconfig:$PKG_CONFIG_PATH export PKG_CONFIG_PATH=$X265_LIB/pkgconfig:$PKG_CONFIG_PATHecho $PKG_CONFIG_PATHBUILD_DIR="../build32"OPTIONS="--toolchain=msvc --arch=x86 --enable-yasm --enable-asm --enable-shared --enable-static --disable-programs --enable-swresample --enable-swscale --enable-gpl --enable-libx264 --enable-libx265 --enable-ffmpeg --enable-ffplay "CC=cl ./configure $OPTIONS --prefix=$BUILD_DIR/make -j 16 make install make clean

经过十几分钟的等待,编译出ffmpeg库:
Windows 下 FFmpeg +X264 +x265的编译和配置
文章图片

--arch=x86 表示编译32位的ffmpeg库。也可以从visual studio command line 64位进入,打开msys2,改sh,编译64位的ffmpeg库(x264 x265也得用64位的dll)。

    推荐阅读