学徒浅析Android开发——windows64下FFmpeg编译问题汇总

最近在编译FFmpeg的过程中着实遇到了一堆问题,FFmpeg其实更适合在LINUX环境下进行开发和封装,因为它所依赖的编译工具和功能扩展插件在LINUX环境下更容易配置。而自己是在windows64环境下进行的编译工作,着实给自己找了不少事干。下面分享下自己在windows64环境下FFmpeg封装过程中遇到的编译失败问题,以供交流。

先说明一下我的编译环境配置

系统环境:windows7 64bit

编译前期配置:

     mingwwindows环境下的linux编译器(64bit)。

     msys:一个小型的GNU环境,包括基本的bashmake等等。与Cygwin大致相当。

  以上两个我是按照Life_XY提供的方法分别安装的。传送门:http://blog.csdn.net/yangyangyang20092010/article/details/46350519

     FFmpeg_source(使用了最新的源码3.4.1果然是最新的没好货,有适配问题)

通常顺利的场景

在执行完./configure ... 操作后,会看到如下成功页面:

学徒浅析Android开发——windows64下FFmpeg编译问题汇总_第1张图片

在执行完 make 命令后,会看到如下成功页面:

学徒浅析Android开发——windows64下FFmpeg编译问题汇总_第2张图片

在执行完make install 后,从根目录输入ffplay命令,会看到如下意味成功的提示:

学徒浅析Android开发——windows64下FFmpeg编译问题汇总_第3张图片

以上是理性情况,但是在实际编译过程中却遇到了如下几种编译问题:

(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环境,否则会编译失败。分别下载:

   1http://ftp.gnome.org/pub/gnome/binaries/win64/dependencies/pkg-config_0.23-2_win64.zip将其中“bin”文件夹下的“pkg-config.exe”文件复制到%mingw%\bin”下。

   2http://ftp.gnome.org/pub/gnome/binaries/win64/dependencies/gettext-runtime_0.18.1.1-2_win64.zip将其中“bin”文件夹下的“intl.dll”文件复制到%mingw%\bin”下。

   3http://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%是你PCmingw的安装目录,我选择的是win64http://ftp.acc.umu.se/pub/gnome/binaries/该路径下还有其他系统类型的文件,大家可以各取所需。

(3)提示 i386:architecture is incompatible with i386:x86-64

  对应方案:这是因为编译64ffmpeg时,必须在./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_depthundeclared (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,要么去ffmpeggit地址上更新libx264.c

(7)提示 no member named wrapper_name  = x264

  对应方案:这个错误指向的是FFmpeglibavcodec/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.dcompat\msvcrt\snprintf.ocompat\strtod.dcompat\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%是你PCmingw的安装目录,再重新执行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中对上报异常的修改,以便及时更新到本地代码中,

 



你可能感兴趣的:(Android开发)