美文网首页Android音视频系列
FFmpeg编译(集成 fdk-aac 与 x264)

FFmpeg编译(集成 fdk-aac 与 x264)

作者: 宝塔山上的猫 | 来源:发表于2018-12-01 19:02 被阅读1次

作为一个刚开始学习ffmpeg,对于C语言了解不深,脚本文件只能说看的懂的人来说,编译这开源项目真难。

为后来者警告

  1. 如果有现成的学习资料,请严格按照学习资料上的各种版本号来编译,不要更换其他版本,否则费事时力。
  2. 网上有很多现成的编译脚本,但是你看看研究一下就好了,因为它们大多数会编译失败,原因就是因为版本的不同。
  3. 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

相关文章

网友评论

    本文标题:FFmpeg编译(集成 fdk-aac 与 x264)

    本文链接:https://www.haomeiwen.com/subject/zmmrcqtx.html