本文使用FFMpeg版本为ffmpeg-4.0.4,NDK版本为android-ndk-r14b。
下载FFMpeg源代码地址:http://www.ffmpeg.org/download.html#releases
编写build脚本:
在FFMpeg根目录新建sh文件,命名为:build_android.sh,复制脚本到build_android.sh, 内容如下:
#!/bin/bash
# ndk环境
exportNDK=/Users/rngp76/Documents/tools/android-ndk-r14b
exportSYSROOT=$NDK/platforms/android-21/arch-arm
exportTOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CPU=armv7-a
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/arm-linux-androideabi
# 要保存动态库的目录,这里保存在源码根目录下的android/armv7-a
exportPREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
$ADDITIONAL_CONFIGURE_FLAG
function build_android
{
echo -e "\033[32m build start \033[0m"
./configure \
--target-os=android \
--prefix=$PREFIX \
--enable-cross-compile \
--enable-static \
--disable-shared \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM-isysroot$ISYSROOT-D__ANDROID_API__=21 -U_FILE_OFFSET_BITS -Os -fPIC -DANDROID -Wno-deprecated -mfloat-abi=softfp -marm" \
--extra-ldflags="$ADDI_LDFLAGS"\
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j16
make install
echo -e "\033[32m build successful \033[0m"
}
function merge
{
echo -e "\033[32m package start \033[0m"
# 打包
$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$SYSROOT/usr/lib \
-L$SYSROOT/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswresample/libswresample.a \
libswscale/libswscale.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
# strip 精简文件
$TOOLCHAIN/bin/arm-linux-androideabi-strip $PREFIX/libffmpeg.so
echo -e "\033[32m package successful \033[0m"
}
build_android
merge
编译配置详解答
1、设置编译针对的系统,网上查到很多资料说编译前需要修改configure文件,设置这项后就不用修改了,系统会自动修改,效果一样。
--target-os=android
2、编译后文件的输出目录
--prefix=$PREFIX
3、 编译动态库,shared和static的开关是相对的。
--enable-static
--disable-shared
4、 生成文档,以及相关的功能模块
--disable-doc
5、 禁止编译可执行文件
--disable-programs
--disable-ffmpeg
--disable-ffplay
--disable-ffprobe
--disable-avdevice
--disable-doc
--disable-symver
6、设置交叉编译器,按照实际路径修改就可以了。
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-
7、 设置编译器,不然会报错,系统默认会使用arm-linux-androideabi-clang,但是此编译器在NDK不存在,导致编译失败
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm
8、 设置编译so库的架构,当前设置为arm,可以根据实际需求修改
--arch=arm
9、 设置编译针对的平台,可以根据实际需求进行设置,当前设置为最低支持android-21版本,arm架构。
--sysroot=$SYSROOT
--extra-cflags="-I$ASM -isysroot $ISYSROOT -D__ANDROID_API__=21 -U_FILE_OFFSET_BITS -Os -fPIC -DANDROID -Wno-deprecated -mfloat-abi=softfp -marm"
--extra-ldflags="$ADDI_LDFLAGS"
10、执行打包
function merge{...} 编译多个so打包为libffmpeg.so。
如果出现下面编译效果,表示编译成功: