Linux下使用android ndk编译FFmpeg(最新版FFmpeg 4.4.1)

附上编译好的android ndk-FFmpeg库:

https://github.com/codeinmyself/FFmpegInAndroid

以及Ubuntu下编译FFmpeg运行的脚本:

https://github.com/codeinmyself/build.sh


查了很多资料,FFmpeg版本都比较旧,有些build出现的问题都没有说清楚,看到一篇google到的编译错误指导(找了好久),刚好解决了我的大部分问题,为了节省大家的时间,将文章转载并用谷歌简单翻译如下:

原文链接:http://alientechlab.com/how-to-build-ffmpeg-for-android/


使用环境:

Ubuntu 16.04 (使用虚拟机VMware)(Ubuntu:http://www.ubuntu.org.cn/download/desktop)

android-ndk-r14b-linux-x86_64(注意在Linux下编译要用Linux版本的:https://developer.android.google.cn/ndk/downloads/index.html

FFmpeg 4.4.1(用官网最新的,首页的绿色的那个就好:http://ffmpeg.org/download.html)用源码编译,首页下面几个展示Ubuntu、windows、Darwin的是已经编译好的FFmpeg的库,这里不用那些。

Linux下使用android ndk编译FFmpeg(最新版FFmpeg 4.4.1)Linux下使用android ndk编译FFmpeg(最新版FFmpeg 4.4.1)

如何为Android构建FFmpeg

你好。
 
我已经决定,我想从Android的源代码生成FFmpeg库。而且,是的,你可以想象这似乎并不那么容易。但最后我做到了!(至少我没有编译错误),我想和你分享我的方法。
 
 

首先是事情

 
获取Linux和VirtualBox
我使用Linux Mint 18.2“Sonya” -最新版本的VirtualBox上的Cinnamon(64位)
然后我使用终端在这个Linux上安装了git,命令如下:

 
源代码
当你有git时,你可以用这个命令克隆源代码:

 
现在你需要Android NDK。在我的情况下,这是android-ndk-r15c-linux-x86_64下载并解压缩android-ndk-r15c-linux-x86_64.zip文件。
 
 

建造

 
当你为Linux构建时,这很容易。只需输入标准./configure,make,make install在为Android构建时,您需要为配置脚本提供其他设置这就是为什么像这样创建构建脚本是个好主意:
 
build_ffmpeg.sh

请记住,你应该在android-ndk-r15c-linux-x86_64中设置--sysroot路径到sysroot文件夹。在我的情况下,路径是:/ home / alien / Desktop / android-ndk-r15c / sysroot将此脚本放在ffmpeg文件夹中。然后使用chmod + x build_ffmpeg.sh将可执行文件添加到文件中最后输入:./build_ffmpeg.sh来运行脚本
 
问题#1
运行脚本后,我得到这个:
 
arm-linux-androideabi-gcc无法创建一个可执行文件。
C编译器测试失败。

如果你认为配置出了问题,确保你使用的是Git的最新版本。如果最新版本失败,请将问题报告给irc.freenode.net上的[email protected]邮件列表或IRC #ffmpeg。包含由configure生成的日志文件“ffbuild / config.log”,这将有助于解决问题。
 
解决方案是通过键入以下命令来安装gcc-arm-linux-androideabi

 
问题#2
重新运行脚本后,我得到这个:
 
libavcodec / aaccoder.c:函数'search_for_ms':
libavcodec / aaccoder.c:803:25:错误:预期的标识符或'('数字常量之前
libavcodec / aaccoder.c: 865:28:错误:作为赋值语句
libavcodec / aaccoder.c的左操作数所需的左值:866:25:错误:'B1'未声明(在此函数中首次使用)
libavcodec / aaccoder.c:866:25:标识符只报告
ffbuild / common.mak中出现的每个函数一次:60:目标配方libavcodec / aaccoder.o失败
make:[libavcodec / aaccoder.o]错误1

 
这里是疯狂的东西aaccoder.c中唯一重要的行是803其余的错误是第一个错误的结果。编译器抱怨的是这样的:

没有看到任何错误?我也是!因为这是正确的。这里的代码是可以的。问题在文件/usr/arm-linux-androideabi/include/asm/termbits.h中它在第116行包含丑陋的#define:

现在,如果我们根据这个#define从aaccoder.c重写行,我们会得到这个:

显然这是错的。这就是为什么编译器预期标识符(但得到号码0000000)。这通过包含头文件的顺序发生:
 
ffmpeg / libavcodec / aaccoder.c文件包括:
libavcodec / avcodec.h文件包括:
libavutil / samplefmt.h文件包括:
libavutil / avutil.h文件包括:
libavutil / common.h文件包含:
libavutil / internal.h文件包括:
libavutil / timer.h文件包括:
/usr/arm-linux-androideabi/include/sys/ioctl.h文件包括:
/ usr / arm-linux-androideabi / include / asm / termbits .h
 
我不知道如何解决这个问题,所以我只是做了很简单的修复。我用B0取代了B0每一个出现aaccoder.c中键入b0并键入make它帮助。
 
问题3
但这还不是全部。同样的问题导致这个错误:
 
libavcodec / hevc_mvs.c:函数'derive_spatial_merge_candidates':
libavcodec / hevc_mvs.c:368:23:错误:'y0000000'未声明(首次在此函数中使用)
libavcodec / hevc_mvs.c:368:23 :注意:每个未声明的标识符只会在
libavcodec / hevc_mvs.c中显示的每个函数报告一次:368:23:error:'x0000000'未声明(在此函数中首次使用)
libavcodec / hevc_mvs.c:函数'ff_hevc_luma_mv_mvp_mode' :
libavcodec / hevc_mvs.c:683:24:错误:'y0000000'未声明(首次在此函数中使用)
libavcodec / hevc_mvs.c:683:24:错误:'x0000000'未声明(首次在此函数中使用)
ffbuild / common.mak:60:目标'libavcodec / hevc_mvs.o'的配方失败

 
解决方案在这里是一样的。hevc_mvs.c中用b0代替B0然后输入make问题#4 同样的故事在这里:libavcodec / opus_pvq.c:函数'quant_band_template': libavcodec / opus_pvq.c:499:9:错误:期望的标识符或'('数字常量之前 libavcodec / opus_pvq.c:560:12:错误:作为赋值左操作数所需的左值 ffbuild / common.mak:60:目标'libavcodec / opus_pvq.o'的配方失败 make:*** [libavcodec / opus_pvq.o]错误1
 


 





 
更换B0B0opus_pvq.c和类型做出
 
问题#5
跆拳道?!stdio.h中 ??? 
 
doc / print_options.c:26:19:致命错误:stdio.h:没有这样的文件或目录
编译终止。
ffbuild / common.mak:152:目标'doc / print_options.o'的配方失败
make:*** [doc / print_options.o]错误1 Ooops

 
看来我已经忘记了Linux的构建要领。要安装这种类型:

 
而且,当然,再次制造
 

有用!

 
或者,至少看起来如此。没有更多的错误,在ffmpeg的子文件夹中,您可以找到* .a文件,这些文件是像libavcodec.a这样的静态库
 
如果你发现同样的错误,我希望这篇文章给你至少一个提示如何解决或在哪里寻找问题。