最近在编译FFmpeg的过程中着实遇到了一堆问题,FFmpeg其实更适合在LINUX环境下进行开发和封装,因为它所依赖的编译工具和功能扩展插件在LINUX环境下更容易配置。而自己是在windows64环境下进行的编译工作,着实给自己找了不少事干。下面分享下自己在windows64环境下FFmpeg封装过程中遇到的编译失败问题,以供交流。
先说明一下我的编译环境配置:
系统环境:windows7 64bit。
编译前期配置:
mingw:windows环境下的linux编译器(64bit)。
msys:一个小型的GNU环境,包括基本的bash,make等等。与Cygwin大致相当。
以上两个我是按照Life_XY提供的方法分别安装的。传送门:http://blog.csdn.net/yangyangyang20092010/article/details/46350519
FFmpeg_source(使用了最新的源码3.4.1果然是最新的没好货,有适配问题)
通常顺利的场景:
在执行完./configure ... 操作后,会看到如下成功页面:
在执行完 make 命令后,会看到如下成功页面:
在执行完make install 后,从根目录输入ffplay命令,会看到如下意味成功的提示:
以上是理性情况,但是在实际编译过程中却遇到了如下几种编译问题:
(1)提示 ffmpeg mktemp:command not found
对应方案:需要下载mltemp.exe 放置到msys/1.0/bin/下。下载路径:https://sourceforge.net/projects/gnuwin32/files/mktemp/1.6/mktemp-1.6-bin.zip/download?use_mirror=ncu
(2)提示 ffmpeg pkg-config: command not found ...
对应方案: pkg-config在执行make命令时会用来构建相应的.a文件等,所以必须要配置pkg-config环境,否则会编译失败。分别下载:
1、http://ftp.gnome.org/pub/gnome/binaries/win64/dependencies/pkg-config_0.23-2_win64.zip将其中“bin”文件夹下的“pkg-config.exe”文件复制到%mingw%的\bin”下。
2、http://ftp.gnome.org/pub/gnome/binaries/win64/dependencies/gettext-runtime_0.18.1.1-2_win64.zip将其中“bin”文件夹下的“intl.dll”文件复制到%mingw%的\bin”下。
3、http://ftp.acc.umu.se/pub/gnome/binaries/win64/glib/2.26/glib_2.26.1-1_win64.zip 将其中“bin”文件夹下的“libglib-2.0-0.dll”文件复制到%mingw%的\bin”下。
%mingw%是你PC中mingw的安装目录,我选择的是win64,http://ftp.acc.umu.se/pub/gnome/binaries/该路径下还有其他系统类型的文件,大家可以各取所需。
(3)提示 i386:architecture is incompatible with i386:x86-64
对应方案:这是因为编译64位ffmpeg时,必须在./configure中声明 --arch=x86_64 否则会导致在编译时调用32位编译器编译。
(4)提示 ffmpeg yasm not found, use --disable-yasm。
对应方案:FFmpeg出于编译效率的考虑,增加了汇编指令,如果电脑未配置汇编指令集(yasm/nasm),则会导致编译失败
需要下载ysam.exe,传送门:http://yasm.tortall.net/Download.html,放置到C:\Windows\System32\目录下,才能被识别。
(5)提示 [install-libavdevice-static] Error 127
对应方案:这个异常时说明你配置的输出路径(--prefix=)有问题,可能存在旧文件,导致无法创建新文件,重新设置./configure 中 --prefix的参数值即可。
(6)提示 libavcodec/libx264.c: In function ‘X264_frame’:
libavcodec/libx264.c:282:9: error: ‘x264_bit_depth’ undeclared (first use in this function); did you mean ‘x264_picture_t’?
if (x264_bit_depth > 8)
^~~~~~~~~~~~~~
x264_picture_t
对应方案:如果你在FFmpeg(3.4.1)上整合x264,便会在make时遇到这个问题,该问题属于ffmpeg自身的兼容问题,最新版本的x264已经废弃了x264_bit_depth参数。
而对应的ffmpeg并没有适配该部分,这个问题FFmpeg是在17年年底才发起票号(https://trac.ffmpeg.org/ticket/6932)处理的,但是已经在git上针对libavcodec/libx264.c做出了修正。
遇到这个问题,要么使用旧版的ffmpeg,要么去ffmpeg的git地址上更新libx264.c
(7)提示 no member named wrapper_name = x264
对应方案:这个错误指向的是FFmpeg中libavcodec/libx264.c出现了无效的引用,屏蔽该引用即可,不会影响到后续功能。
(8)提示 unable to rename "avfiler-6.dll或其他文件" reason :File exists
对应方案:在执行make install命令时,出现该错误提示,可以无视,继续重复执行make install,差不多5次后就会提示安装完毕。
这个现象跟mingw有关,毕竟是在windows环境模拟LINUX环境。
(9)提示 ffmpeg/compat/strtod.o error 或相似的错误
对应方案:这种错误说明你没有执行make clean命令或者说执行make clean后,清除指令没有执行完全,仍然有残留的旧文件,旧文件会影响当前的编译,
可以在执行完make clean后,手动检查下compat目录下是否存在compat\msvcrt\snprintf.d、compat\msvcrt\snprintf.o、compat\strtod.d、compat\strtod.o这四个文件,若有删除即可。
(10)编译成功后的FFmpeg文件播放视频没有声音。
对应方案:一般是没有整合SDL,下载地址:http://www.libsdl.org/release/SDL2-devel-2.0.5-mingw.tar.gz 解压后直接拿来用就ok了。
将x86_64-w64-mingw32下的lib的所有文件复制到%mingw%的\lib;
将x86_64-w64-mingw32下的include的所有文件复制到%mingw%的include;
将x86_64-w64-mingw32下的bin的所有文件复制到%mingw%的\bin;
%mingw%是你PC中mingw的安装目录,再重新执行make clean -> make -> make install
(11)在windows环境下,整合SDL后调用ffmplay xxx.mp4播放依然没有声音。
对应方案:这个现象跟windows环境有关系,在StackOverflow上有人给出了方案,具体的异常原因不清楚。传送门:https://stackoverflow.com/questions/46835811/ffplay-wasapi-cant-initialize-audio-client-ffmpeg-3-4-binaries,原文表示设置一个环境变量SDL_AUDIODRIVER=directsound或者winmm即可,即在ffmplay xxx.mp4之前,先调用set SDL_AUDIODRIVER=directsound命令即可实现音频播放。
目前遇到的编译问题就是这些,FFmpeg最新版本确实存在着兼容问题,如果整合x265等,也许会出现其他问题,所以我们在构建.so文件时最好用旧版FFmpeg进行编译或者时刻关注https://trac.ffmpeg.org/ticket中对上报异常的修改,以便及时更新到本地代码中,