编译环境:
macOS:10.13.6
NDK:android-ndk-r14b
ffmpeg:4.0版本
一、下载或者clone ffmpeg工程
ffmpeg的官网:
http://ffmpeg.org/download.html#repositories
在指定的目录下clone ffmpeg代码
git clone https://git.ffmpeg.org/ffmpeg.git
这个时候下载下来的ffmpeg是最新版本的,git branch -a 可以查看已经有的版本,git checkout -b ffmpeg_4.0 remotes/origin/origin/release/4.0,切换到4.0分支,也就是4.0的稳定版本。
二、NDK下载并配置
可以直接去官网下载
https://developer.android.google.cn/ndk/downloads/
这里选择了android-14b版本进行下载
下载完成后配置ndk环境:
在终端输入:vi ~/.bash_profile
输入配置ndk:
export ANDROID_NDK_ROOT=/自己的路径/android-ndk-r14d/build
export PATH=${PATH}:${ANDROID_NDK_ROOT}
:wq完成保存输入后:source ~/.bash_profile 完成配置的保存
三、编译ffmpeg
1.修改configure文件
由于原先编译出来的动态库文件名的版本号在.so之后,如libavcodec.so.5.100.1,Android平台不能识别这种文件,所以需要修改文件名。
在下载或者clone的文件夹下,找到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)'
2.编写脚本文件
在ffmpeg中创建一个build_android.sh的脚本
#!/bin/bash
ADDI_CFLAGS="-marm"
API=22
PLATFORM=arm-linux-androideabi
CPU=armv7-a
#使用自己的路径
export TMPDIR=/Users/hfy/Documents/ffmpeg/ffmpegout
NDK=/Users/hfy/Documents/Studio/android-ndk-r14b
SYSROOT=$NDK/platforms/android-$API/arch-arm/
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/$PLATFORM
TOOLCHAIN=$NDK/toolchains/$PLATFORM-4.9/prebuilt/darwin-x86_64
#手动创建输出目录
OUTPUT=/Users/hfy/Documents/ffmpeg/out
function build_one
{
./configure \
--prefix=$OUTPUT \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic -marm" \
--extra-ldflags="-marm" \
$ADDITIONAL_CONFIGURE_FLAG
sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h
make clean
# 这里是定义用几个CPU编译,我用4个,一般在5分钟之内编译完成
make -j4
make install
}
build_one
完成之后,赋予build_android.sh可执行权限
chmod a+x build_android.sh 或者 chmod 777 build_android.sh
3、执行
在ffmpeg目录下,先./configure,先生成*mak文件
完成后执行./build_android.sh
等待几分钟后,可以在输出目录中看到生成的so文件:
如果需要生成其他平台的so文件,修改build_android.sh输出的平台即可。
错误处理参考:
https://www.jianshu.com/p/03a9c4edc574
https://github.com/Bilibili/ijkplayer/issues/1335