之所以在愉快二字上加引号,相信编译过FFMPEG的同学会深有体会,根本不存在愉快二字,编译FFMPEG是痛苦,尤其是在Windows环境下面。打开搜索引擎随手搜索一把编译FFMPEG,就会有很多文章,我相信即使你老老实实按照文章的步骤来编译,也会心里骂娘的。
之所以说是愉快的编译,主要是因为windows10提供了WSL,比起以前需要用到的linux模拟环境要强很多,是非常接近原生linux系统的环境了。所以在第一次在WSL编译FFMPEG还是顺利到吓人。当然前提是我们需要先运行一下visual studio command prompt,这个工具会将当前的控制台配置好vs的c 的工具的环境变量啥的,然后直接敲入bash回车,此时控制台会启动WSL,进入linux环境,这个linux环境是可以访问刚才配置的环境变量的,所以可以调用windows下的编译工具进行编译。微软本身提供了FFmpegInterop这个开源项目来编译FFMPEG,但是很难用,对vs版本也有限制,我用的vs2019,所以并不支持。
虽然第一次编译FFMPEG很顺利,但是当我想让FFMPEG带上x265编码器的时候,麻烦来了。首先需要编译x265,这玩意儿做的还是很贴心,build目录下有
arm-linux/ msys-cl/ vc10-x86_64/ vc12-x86/ vc15-x86_64/ xcode/
linux/ vc11-x86/ vc12-x86_64/ vc9-x86/
msys/ vc10-x86/ vc11-x86_64/ vc15-x86/ vc9-x86_64/
这么多环境的编译脚本,算是考虑周全了,我先是用linux下的,编译通过,但转念一想不对,我是编译windows下的ffmpeg,链接linux环境的x265包肯定不对啊。试了一下用vc开头的目录,各种报错,放弃了。这时候我把目光停留在了msys-cl和msys两个目录上了。之前搜索文章的时候,都说ffmpeg编译要通过msys。那么显然用这个环境是最合适的了。
下载msys2(这个和msys还不一样,里面狗血剧情自行搜索),然后打开visual studio command prompt,进入msys64/usr/bin。输入bash回车,进入msys环境,开始编译。编译成功,产生了windows下的lib文件和dll之类。回到ffmpeg,加入配置参数,--enable-libx265开始编译,报找不到x265。打开日志说找不到x265.h头文件,可头文件明明就在那儿啊。后来无论我把头文件放哪儿,无论参数怎么配置,就是死活报这个错误。要奔溃了。
试遍网上说的各种方法,还是报这个错。我意识到问题不是出在这里。暂时没办法的情况下尝试了一下使用inter的编码器,问题更多,但却意外发现了可能是64位和32位不兼容的问题。
事实证明确实如此,在启动visual studio command prompt的时候要选择x64的环境,保证所有库也是x64的,不过当我运行x265的脚本的时候却报64 bit target not set, please launch 'visual studio command prompt' and run '..vcvarsall.bat amd64 | x86_amd64 | amd64_x86'
怎么可能,我明明设置x64环境啊。我愤怒打开脚本,看到了如下的脚本:
代码语言:javascript复制target_processor='amd64'
path=$(which cl)
if cl; then
echo
else
echo "please launch 'visual studio command prompt' and run '..vcvarsall.bat amd64'"
echo "and then launch msys bash shell from there"
exit 1
fi
if [[ $path == *$target_processor* ]]; then
echo
else
echo "64 bit target not set, please launch 'visual studio command prompt' and run '..vcvarsall.bat amd64 | x86_amd64 | amd64_x86'"
exit 1
fi
cmake -G "NMake Makefiles" -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4" ../../source
if [ -e Makefile ]
then
nmake
fi
原来是判断了amd64,我忽略了所有的判断,直接执行
代码语言:javascript复制cmake -G "NMake Makefiles" -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4" ../../source
成功!,再执行nmake,编译出来了,接着执行ffmpeg的configure,终于成功了。make,也顺利通过。功夫不负有心人。