作为一个刚开始学习ffmpeg,对于C语言了解不深,脚本文件只能说看的懂的人来说,编译这开源项目真难。
为后来者警告
- 如果有现成的学习资料,请严格按照学习资料上的各种版本号来编译,不要更换其他版本,否则费事时力。
- 网上有很多现成的编译脚本,但是你看看研究一下就好了,因为它们大多数会编译失败,原因就是因为版本的不同。
- FFmpeg 这个项目一直都有很多大神在维护,因此它是不断的与时俱进的,因此如果使用更新的版本,那么就需要把想要的编译条件改一下,否则会出现各种错误,如集成 x264 的时候发生找不到库的情况。
环境与源码
ubuntu 14
ndk : android-ndk-r15c
x264 : 目前最新的版本稳定版本 x264-snapshot-20181130-2245-stable ,下载地址为:
http://download.videolan.org/pub/videolan/x264/snapshots/
fdk-aac : fdk-aac-0.1.6, 下载地址为:
https://downloads.sourceforge.net/opencore-amr/fdk-aac-0.1.6.tar.gz
ffmpeg : 3.3.9 "Hilbert", 下载地址为:
http://www.ffmpeg.org/releases/ffmpeg-3.3.9.tar.gz
构建项目位置:
https://github.com/liaozhoubei/FFmpegForAndroid
构建项目
-
在构建之前需要将配置好 NDK 的位置,如x264的arm构建脚本为:
NDK=~/AndroidSdk/android-ndk-r15c PLATFORM=$NDK/platforms/android-18/arch-arm TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 PREFIX=./android/arm function build_one { cd ../x264 ./configure \ --prefix=$PREFIX \ --disable-shared \ --enable-static \ --disable-asm \ --enable-pic \ --enable-strip \ --host=arm-linux-androideabi \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --sysroot=$PLATFORM \ --extra-cflags="-Os -fpic" \ --extra-ldflags="" \ make clean make -j4 make install cd .. } build_one
那么你需要把NDK的位置设置为自己的ndk位置
- 开始构建
如果只是需要构建x264,那么在build_264 的目录下,运行 sh ./build_x264_all.sh 脚本即可
如果需要一次性构建ffmpeg并且集成x264和fdkac, 那么进入 ffmpeg-3.3.9 目录下运行 build_ffmpeg_all.sh 即可。
构建完毕会在目录下生成 android 文件夹。
若构建正常,此目录下会有五个目录文件,如下
arm arm64-v8a mips x86 x86_6
构建问题
一般如果没有使用本文中的默认配置(如自己下载原始的文件进行构建),那么很有可能出现以下问题,
编译x264 问题
出现:
libx264.a(encoder-8.o):encoder.c:function validate_parameters: error: undefined reference to 'log2f'
libx264.a(encoder-8.o):encoder.c:function validate_parameters: error: undefined reference to 'log2f'
libx264.a(encoder-10.o):encoder.c:function validate_parameters: error: undefined reference to 'log2f'
libx264.a(encoder-10.o):encoder.c:function validate_parameters: error: undefined reference to 'log2f'
libx264.a(ratecontrol-8.o):ratecontrol.c:function x264_8_ratecontrol_new: error: undefined reference to 'log2'
libx264.a(ratecontrol-8.o):ratecontrol.c:function x264_8_ratecontrol_new: error: undefined reference to 'log2'
libx264.a(ratecontrol-8.o):ratecontrol.c:function x264_8_ratecontrol_new: error: undefined reference to 'log2'
libx264.a(ratecontrol-10.o):ratecontrol.c:function x264_10_ratecontrol_new: error: undefined reference to 'log2'
collect2: error: ld returned 1 exit status
make: *** [x264] 错误 1
将编译的目标版本设高一点即可,如原本
PLATFORM=$NDK/platforms/android-14/arch-arm
改为
PLATFORM=$NDK/platforms/android-18/arch-arm
即可解决
ffmpeg 编译arm_v7a 时找不到x264与fdkaac
原因:x264与fdkaac并没有编译arm_v7a版本
解决方案:使用 x264与fdkaac 编译出来的arm库即可
修改生成的so库的后缀名
直接使用脚本生成的so库一般会有后缀名,如x264编译出来的库是libx264.so.148,android 系统不能识别这样的库,会引发库打开异常,研究了半天,终于尝试到解决的办法,(注意,此处不能直接改文件名解决,因为改文件名并不会直接改变库的名字)
对 x264 进行修改
打开x264的 configure文件,将"SONAME=libx264.so.$API"这里改为"SONAME=libx2641.so"(soname就是编译生成so库的名称的意思,这个名字不能是libx264.so,因为x264编译的时候会生成一个libx2641.so的中间文件,会冲突)
作者:Vasil 原文:https://blog.csdn.net/qq_25817651/article/details/52372618
对 libfdk-aac 进行修改
进入 在 libfdk-aac 目录下找到 m4 目录并打开里面的 libtool.m4 文件:
全局搜索 so.1,替换为 so
全局搜索 $versuffix ,替换为空字符,也就是删除它
全局搜索 $major ,,替换为空字符,也就是删除它
作者:剑西 原文:https://blog.csdn.net/mabeijianxi/article/details/74544879
注意,修改 libtool.m4 可能会出现
fdk-aac/missing: row 81: aclocal-1.15: command not found
之类的情况导致无法编译,这时需要在fdkaac目录下执行以下命令:
sudo apt-get install autoconf
sudo apt-get install libtool
autoreconf -f -i
对 FFmpeg 修改
在以前的一些文章中会提到需要对 configure 文件进行修改,但是对于现在的版本(如 3.3.9)而已并不需要,只需要在写配置的时候设置:
--target-os=android \
那么生成的so库自然就不会带有后缀
本文中大部分构建脚本来自于
剑西
https://blog.csdn.net/mabeijianxi/article/details/74544879
如有疑问,可到他的博客参考一下
参考资料:
最简单的基于FFmpeg的移动端例子:Android HelloWorld
https://blog.csdn.net/leixiaohua1020/article/details/47008825
Mac 下为将ffmepg +x264移植到android中,解决libx264.so.148 库cannot find问题
https://blog.csdn.net/qq_25817651/article/details/52372618
网友评论