请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/74544879
源码或工具版本:
- ndk :r14
- FFmpeg 版本:3.2.5
- libfdk-aac 版本:0.1.5
一、源码准备:
这里假设你已经拥有了ndk环境,没有的可以先配置,可以参考Android下玩JNI的新老三种姿势。
- FFmpeg源码下载地址:http://ffmpeg.org/download.html。
- libx264下载地址:http://www.videolan.org/developers/x264.html
- libfdk-aac下载地址:http://www.linuxfromscratch.org/blfs/view/7.7/multimedia/fdk-aac.html
二、编写全平台脚本:
脚本地址: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。