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的库,这里不用那些。
如何为Android构建FFmpeg
你好。
我已经决定,我想从Android的源代码生成FFmpeg库。而且,是的,你可以想象这似乎并不那么容易。但最后我做到了!(至少我没有编译错误),我想和你分享我的方法。
首先是事情
获取Linux和VirtualBox
我使用Linux Mint 18.2“Sonya” -最新版本的VirtualBox上的Cinnamon(64位)。
然后我使用终端在这个Linux上安装了git,命令如下:
1
2
3
|
sudoapt-getinstallgit-y
|
源代码
当你有git时,你可以用这个命令克隆源代码:
1
2
3
|
gitclone"https://git.ffmpeg.org/ffmpeg.git"ffmpeg
|
现在你需要Android NDK。在我的情况下,这是android-ndk-r15c-linux-x86_64。下载并解压缩android-ndk-r15c-linux-x86_64.zip文件。
建造
当你为Linux构建时,这很容易。只需输入标准./configure,make,make install。在为Android构建时,您需要为配置脚本提供其他设置。这就是为什么像这样创建构建脚本是个好主意:
build_ffmpeg.sh
1
2
3
4
|
./configure--cross-prefix=arm-linux-androideabi---sysroot="/home/alien/Desktop/android-ndk-r15c/sysroot"--target-os=linux--arch=arm--cpu=cortex-a8--enable-cross-compile--enable-pic--enable-shared--extra-cflags="-fpic"
make
|
请记住,你应该在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:
1
2
3
|
sudoaptinstallgcc-arm-linux-androideabi-y
|
问题#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。其余的错误是第一个错误的结果。编译器抱怨的是这样的:
1
2
3
|
intB0=0,B1=0;
|
没有看到任何错误?我也是!因为这是正确的。这里的代码是可以的。问题在文件/usr/arm-linux-androideabi/include/asm/termbits.h中。它在第116行包含丑陋的#define:
1
2
3
|
#define B0 0000000
|
现在,如果我们根据这个#define从aaccoder.c重写行,我们会得到这个:
1
2
3
|
int0000000=0,B1=0;
|
显然这是错的。这就是为什么编译器预期标识符(但得到号码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
更换B0由B0在opus_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的构建要领。要安装这种类型:
1
2
3
|
sudoapt-getinstallbuild-essential-y
|
而且,当然,再次制造。
有用!
或者,至少看起来如此。没有更多的错误,在ffmpeg的子文件夹中,您可以找到* .a文件,这些文件是像libavcodec.a这样的静态库。
如果你发现同样的错误,我希望这篇文章给你至少一个提示如何解决或在哪里寻找问题。