编译Android下可用的全平台FFmpeg(包含libx264与libfdk-aac)

版权声明:本文为“剑西”原创文章,转载需注明出处! https://blog.csdn.net/mabeijianxi/article/details/74544879


请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/74544879

源码或工具版本:

  • ndk :r14
  • FFmpeg 版本:3.2.5
  • libfdk-aac 版本:0.1.5

一、源码准备:

这里假设你已经拥有了ndk环境,没有的可以先配置,可以参考Android下玩JNI的新老三种姿势

二、编写全平台脚本:

脚本地址:https://github.com/mabeijianxi/FFmpeg4Android,脚本目录结构如下:

  • ffmpeg-3.2.5
    • jianxi_ffmpeg_build_all.sh
    • jianxi_ffmpeg_arm64_v8a_build.sh
    • jianxi_ffmpeg_arm_build.sh
    • jianxi_ffmpeg_arm_v7a_build.sh
    • jianxi_ffmpeg_x86_64_build.sh
    • jianxi_ffmpeg_x86_build.sh
    • jianxi_ffmpeg_build_all_more.sh
    • jianxi_ffmpeg_arm64_v8a_build_more.sh
    • jianxi_ffmpeg_arm_build_more.sh
    • jianxi_ffmpeg_arm_v7a_build_more.sh
    • jianxi_ffmpeg_x86_64_build_more.sh
    • jianxi_ffmpeg_x86_build_more.sh
    • fdk-aac-0.1.5
      • fdk_aac_arm64_v8a_build.sh
      • fdk_aac_arm_build.sh
      • fdk_aac_build_all.sh
      • fdk_aac_mips_build.sh
      • fdk_aac_x86_64_build.sh
      • fdk_aac_x86_build.sh
    • libx264
      • x264_arm64_v8a_build.sh
      • x264_arm_build.sh
      • x264_build_all.sh
      • x264_mips_build.sh
      • x264_x86_64_build.sh
      • x264_x86_build.sh

jianxi_ffmpeg_build_all.sh 可生成精简版的全平台 FFmpeg 动态库,产物目录为:/ffmpeg-3.2.5/android/,jianxi_ffmpeg_build_all_more.sh 将生成增强版的全平台 FFmpeg 动态库,产物地址为:/ffmpeg-3.2.5/android_more。

三、修改脚本和源码

1、如果你用我源码:

你如果直接下载我修改好的 FFmpeg 源码与 libfdk-aac 源码那么你需要做的工作将会少一些,你找到上面所列目录结构里的脚本,修改每个脚本里面 "NDK" 变量所指向的地址为你本机地址,其次如果你不是 mac 系统而是 Linux 系统,那么你还需要把里面包含 darwin-x86_64 的字样修改为 linux-x86_64

2、如果重新下载官方源码:

这样你需要做的工作为稍微多一些。

  • 首先你下载好了 FFmpeg、libx264、libfdk-aac 然后解压且按照上面 二 中我列的目录结构排放这个三个库的源码。
  • 把脚本按照对应按照目录结构放入相应文件夹。
  • 修改每个脚本里面 "NDK" 变量所指向地址为你本机地址,其次如果你不是 mac 系统而是 Linux 系统,那么你还需要把里面包含 darwin-x86_64 的字样修改为 linux-x86_64
  • 对 FFmpeg 源代码中的configure文件进行修改。由于编译出来的动态库文件名的版本号在.so之后(例如“libavcodec.so.5.100.1”),而android平台不能识别这样文件名,所以需要修改这种文件名。
    找到 FFmpeg 目录下的configure文件,打开找到以下几行:
    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'  
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'  
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'  
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
    替换为下面内容:
    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'  
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'  
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'  
    SLIB_INSTALL_LINKS='$(SLIBNAME)'
  • 对 libfdk-aac 进行修改
    进入 在 libfdk-aac 目录下找到 m4 目录并打开里面的 libtool.m4 文件:
    全局搜索 so.1,替换为 so
    全局搜索 $versuffix ,替换为空字符,也就是删除它
    全局搜索 $major ,,替换为空字符,也就是删除它

编译

打开终端, cd 进入你的 ffmpeg 目录,新建一个 ffmpegtemp 目录,也就是执行 mkdir ffmpegtemp 即可。
然后如果你需要编译全架构,执行:
./jianxi_ffmpeg_build_all.sh 或 ./jianxi_ffmpeg_build_all_more.sh
如果你只编译某个平台执行响应脚本即可。

收集产物

精简版的 FFmpeg 的 动态库目录在 ffmpeg-3.2.5/android 下,增强版的 FFmpeg 的 动态库目录在 ffmpeg-3.2.5/android_more 下。


温馨提示

由于我编写脚本的时候是根据自己的目录和电脑配置来的,比如 libx264 、fdk-aac-0.1.5 等目录在脚本中写死的,再比如编译的时候我用来 make -j16 ,这表示有16个线程并发编译,我电脑编译全架构时发热也超级厉害,你可以根据自己配置跳转这个数值。

我 FFmpeg 的编译选项中开启了 neon与 yasm ,这都是一些优化配置,如果你编译的时候发现它们妨碍了你,可以将其关闭。

如果你想跟着我一起测试编译好的 FFmpeg 在 Android 上的表现可以锁定 编译Android下可执行命令的FFmpeg 这个频道

最后附上所有源码与脚本地址:https://github.com/mabeijianxi/FFmpeg4Android


猜你喜欢

转载自blog.csdn.net/mabeijianxi/article/details/74544879