本文是在 msys2 环境下进行操作的,不熟悉 msys2 的可以看 《MSYS2介绍》。
FFmpeg-n4.4.1 版本的源码编译,无论你是在 Linux 还是 Windows 环境编译,默认都会有 h.264 编码器。
Linux 下的是使用 V4L2 来做的 h.264 编码器,如下:
V4L2 全称是 Video for Linux2 ,是Linux系统的视频设备内核驱动。m2m 全称是什么我也不知道,后面补充。
Windows 下的是使用 Media Foundation 来做的 h.264 编码器,如下:
x264 有些功能是上面两个自带的 h.264 编码器没有的,所以本文介绍一下编译 FFmpeg 的时候如何引入 x264。
先讲解 MinGW 下如何引入 x264,在 msys2 的云仓库,也是有 x264 的安装包的,所以我们不用自己编译,如下:
直接执行以下命令,安装 x264 即可。
pacman -S mingw-w64-x86_64-x264
提示:如果下载比较慢,可以切换 msys2 的源为中科大的源,请看《MSYS2 更换国内源》
从下图可以看到,跟之前安装 SDL 一样,也是安装了一堆 x264 的头文件,静态库,动态库。
安装完 x264 之后,因为他那些什么 pc 文件都放好给你的了,所以只需要再 configure的时候加上 --enable-libx264
即可,如下:
./configure \ --prefix=/home/loken/ffmpeg/build64/ffmpeg-n4.4.1-mingw \ --enable-gpl \ --enable-debug=3 \ --disable-optimizations \ --disable-asm \ --disable-stripping \ --enable-nonfree \ --enable-libx264 \ --enable-shared make -j12 make install
编译完成之后,使用 ffmpeg.exe -codecs
即可查看 h.264 的编码器。如下:
用 dumpbin 查看发现,ffmpeg.exe 依赖 avcodec-58.dll ,而 avcodec-58.dll 依赖 libx264-161.dll,如下:
下面再来讲一下 MSVC 的环境下 怎么引入 x264 扩展,MinGW 编译出来的 x264 动态库应该也是不太方便被 MSVC 使用的,所以还是重新编译一下 x264 的源码。
先删掉之前安装的 mingw-w64-x86_64-x264 ,防止干扰。
pacman -R mingw-w64-x86_64-x264
发现删除 mingw-w64-x86_64-x264 很麻烦,会不断地依赖反转,无法正常删除,所以暂时不删应该也影响不大。
x264
的官网 是 x264.org ,源码地址,x264 这个开源项目没有发布过一次版本,tag 也没有,所以只能拉最新代码。拉下来的代码如下:
x264 没有 vs 的 sln 文件,不过他的 configure 脚本定义了 CC 编译器变量,只需要把这个变量从 gcc 换成 cl.exe 即可。
x264 的源码是可以用 msvc 编译的,所以改脚本的 CC 变量是可以的。编译命令如下:
CC=cl ./configure --prefix=/home/loken/ffmpeg/build64/x264-msvc --enable-shared --disable-asm make -j12 make install
提示:--disable-asm 是禁用 x264 的汇编优化,会有近 5 倍左右的性能下降,生产环境谨慎使用
上面的命令写法有点奇怪,CC=cl 后面直接跟 ./configure 。这种写法是把 CC 变量设置成cl,再执行 configure。这样设置变量的好处是只对当前命令生效。例如 后面的 make 就没有 CC 变量。
CC 这个变量在 configure 文件的用法是这样的,如下:
CC="${CC-${cross_prefix}gcc}"
可以把上面的 shell 看成一个 三元表达式,如果 CC 定义了,就CC=CC,如果没定义CC = ${cross_prefix}gcc。
编译完成之后,libx264.dll.lib 跟 libx264-157.dll, 文件都生成了,如下:
现在只需要把相关的头文件,动态库跟lib导入库,放到 msys2 的目录,让 FFmpeg 的编译脚本能找到 这些 lib 跟dll 即可。
FFmpeg 编译的时候会用到 哪些 x264 的头文件?其实可以直接看 pacman 安装的时候装了哪些头文件,其实是一样的,参考着搞就行。
上图这些头文件,在 x264 的源码包都是有的,我们把这些头文件拷贝到 /usr/local/include
目录下,请看下图:
提示:思路不要被 mingw-w64-x86_64-x264 安装包干扰,配置 msvc 环境要假设我们从来没安装过 mingw-w64-x86_64-x264 这个安装包。我上面贴个图只是提供一下找头文件的思路。
提示:avisynth_c.h 这个文件是在 源码包的 extra 目录下的。
接下来再配置一下 x264.pc
文件,路径跟内容如下:
prefix=/home/loken/ffmpeg/build64/x264-msvc libdir=/usr/local/lib/x64/ includedir=/usr/local/include/x264/ Name: x264 Description: H.264 (MPEG4 AVC) encoder library Version: 0.157.x Libs: -L/usr/local/lib/x64 libx264.dll.lib Libs.private: Cflags: -I/usr/local/include/x264/
提示:上面的导入库我写了全称,没有 -l
选项。因为用 -l
好像有点小问题。
要执行以下命令,把 /usr/local/lib/pkgconfig/
加入搜索路径:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/:$PKG_CONFIG_PATH
下面再次编译 FFmpeg,如下:
./configure \ --prefix=/home/loken/ffmpeg/build64/ffmpeg-n4.4.1-msvc-x264 \ --enable-gpl \ --enable-debug=3 \ --disable-optimizations \ --disable-asm \ --disable-stripping \ --enable-nonfree \ --enable-libx264 \ --enable-shared \ --toolchain=msvc make -j48 make install
编译成功之后,只需要把之前 msvc 编译出来的 libx264-157.dll 拷贝到 ffmpeg.exe 同目录的位置即可,如下:
参考资料: