在Win10中编译完x264、x265后,开始编译FFmpeg,并将集成这几个主流视频编解码算法
准备
系统环境: Win10 + VS2019
编译环境: Mingw64 + msys2 + cmake + yasm + nasm
编码算法:x264_161、x265_3.3、avs2(xavs2_1.3、davs2_1.6)
为方便将以上编码器一起集成到FFmpeg中,全部采用msys2编译,并编译到同一地址,本人全部编译到 /home/build 中, 即在编译时,全部采用./configure --prefix=/home/build
,这样三个编码器+一个解码器(avs2 分为:编码器 xavs2 和解码器 davs2)全部放在同一文件夹中。
AVS2编译
AVS2是我国自主研制的视频编码算法,具体框架与HEVC类似,性能上也对标HEVC。北京大学数字视频编解码技术国家工程实验室已开源AVS2高清实时编码器。AVS3正在研制中,还未看到开源代码。
FFmpeg已可集成AVS2编解码器,因此顺便编译了AVS2,与FFmpeg一起编译。
AVS2编译过程很简单,有msys2和VS工程两种,在开源中已明确说明编译方法,不再赘述,这里采用msys2编译。
FFmpeg编译
- 将获取的源码拷到msys2中(本人下载的FFmpeg_4.4版本);
- 由于可选编译选项比较长,这里采用创建sh脚本的方式,输入编译指令:在 ffmpeg-4.4文件夹中创建build.sh,可通过
vim build.sh
创建并编写脚本。本人编写的 sh 文件如下:
./configure \
--enable-shared \
--enable-static \
--enable-gpl \
--enable-encoder=libx264 \
--enable-encoder=libx265 \
--enable-encoder=libxavs2 \
--enable-libx264 \
--enable-libx265 \
--enable-libxavs2 \
--enable-asm \
--prefix=/home/ffmpeg \
--extra-cflags=-I/home/build/include \
--extra-ldflags=-LIBPATH:/home/build/lib
make
make install
- 注意: FFmpeg好像不能集成版本号 >= 1.6 的 davs2解码器,现在在北大官网下载的只有 davs2_1.6,因此这里没有集成解码器,如需要可添加
--enable-decoder=libdavs2 \ --enable-libdavs2
- 我目前还不知道
--enable-encoder=libx264
和--enable-libx264
有什么区别,有这个选项就都输上了。。
- 开始编译前,还需要修改一个环境变量:PKG_CONFIG_PATH
- 本人在直接运行 build.sh 后报错
ERROR:libx264 not found
,查看 ffmpeg-4.4/ffbuild/config.log,发现最后会提示在路径 PKG_CONFIG_PATH 下没有找到libx264(具体咋写的忘了),查看此路径echo $PKG_CONFIG_PATH
,发现定位如上图; - PKG_CONFIG_PATH 指之前x264、x265等编译后,生成的lib文件夹中的pkgconfig文件夹,其中的几个pc文件会指引查询到x264、x265、avs2的库文件和头文件;
- 因此,使用
export PKG_CONFIG_PATH=/home/build/lib/pkgconfig
将此环境变量定位在正确位置,再开始配置和编译; - 实际上本人在修改完这个后,仍遇到了
ERROR:libx264 not found
错误,查看 config.log 发现跟此次 PKG_CONFIG_PATH 无关,但仍未找到 lx264,最终发现是在/home/build/lib/路径中,我本来是删去了libx264.dll.a 的动态链接库,libx264.a 仍在,但FFmpeg没找到 lx264,不知道为啥必须要这个动态链接库,反正添加上之后就正确了。
- 配置成功后,在弹出的配置列表中可以找到 Enabled encoders,其中包含了 libx264,libx265,libxavs2等,这在未配置几个编码器前是没有的,说明此时 configure 成功,可以开始编译
5. 编译完成,在生成的 ffmpeg文件夹中可以看到以下4个文件夹,其中bin文件中的ffmpeg.exe可以直接运行,运行如下:
测试用FFmpeg进行x265编码,ffmpeg -i test.mp4 -c:v libx265 -an output.265
,可以输出265压缩码流文件。编译成功!