下载ffmpeg库,本文以ffmpeg-4.2.3为例。
编译工具链
对于C/C++的编译,通常有两个工具 GCC 和 CLANG 。这两个库的区别就不介绍了,感兴趣的同学自行查阅相关资料。
Google在 ndk 17 以后,把 GCC 移除了,全面推行使用 CLANG 。所以各位同学一定要注意自己的ndk环境。
编译、交叉编译工具目录
编译工具链目录:
android-ndk-r17c/toolchains/llvm/prebuilt/darwin-x86_64/bin
交叉编译环境目录:
android-ndk-r17c/sysroot
有意思的是ndk 17之后的版本中toolchains/llvm/prebuilt/darwin-x86_64路径下也有sysroot文件夹。
1)toolchains目录结构
2)sysroot目录结构
该目录右侧列出来支持的不同CPU架构及编辑版本,我们选择 CPU 架构 armv7a,Android版本 21为例
armv7a-linux-androideabi21-clang
armv7a-linux-androideabi21-clang++
使用 GCC 编译FFmpeg
下载 NDK r17c库
编译脚本
打开ffmpeg-4.2.3文件夹,创建脚本文件build_gcc_arm.sh,编辑脚本内容
CPU=armv7-a
API=21
ARCH=arm
NDK=/Users/liuhongshuo/AnroidPro/ffmpeg/android-ndk-r17c
SYSROOT=$NDK/platforms/android-$API/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/arm-linux-androideabi
# 要保存动态库的目录,这里保存在源码根目录下的android/armv7-a
PREFIX=$(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 \
--arch=$ARCH \
--cpu=$CPU \
--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 \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $ISYSROOT -D__ANDROID_API__=$API -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
编译配置详解答
设置编译针对的系统
–target-os=android \
编译后文件的输出目录
–prefix=$PREFIX \
–enable-cross-compile \
编译动态库,shared和static的开关是相对的。
–enable-static
–disable-shared \
生成文档,以及相关的功能模块
–disable-doc \
禁止编译可执行文件
–disable-programs
–disable-ffmpeg
–disable-ffplay
–disable-ffprobe
–disable-avdevice
–disable-doc
–disable-symver \
设置交叉编译器,按照实际路径修改就可以了。
–cross-prefix=KaTeX parse error: Undefined control sequence: \ at position 38: …x-androideabi- \̲ ̲ 设置编译器 --cc=TOOLCHAIN/bin/arm-linux-androideabi-gcc
–nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
设置编译so库的架构,当前设置为arm,可以根据实际需求修改
–arch=arm \
设置编译针对的平台,可以根据实际需求进行设置,当前设置为最低支持android-21版本,arm架构。
–sysroot=KaTeX parse error: Undefined control sequence: \ at position 9: SYSROOT \̲ ̲--extra-cflags=…ASM -isysroot $ISYSROOT -D__ANDROID_API__=21 -U_FILE_OFFSET_BITS -Os -fPIC -DANDROID -Wno-deprecated -mfloat-abi=softfp -marm" \
–extra-ldflags="$ADDI_LDFLAGS" \
启动编译
打开 命令终端,cd 到ffmpeg-4.2.3目录,执行 build_gcc_arm.sh,然后喝杯咖啡等待运行结果。
使用 CLANG 编译FFmpeg
下载NDK最新版本
编译脚本
打开ffmpeg-4.2.3文件夹,创建脚本文件build_clang_arm.sh,编辑脚本内容
CPU=armv7-a
API=21
ARCH=arm
NDK=/Users/liuhongshuo/AnroidPro/ffmpeg/android-ndk-r20
SYSROOT=$NDK/platforms/android-$API/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/arm-linux-androideabi
# 要保存动态库的目录,这里保存在源码根目录下的android/armv7-a
PREFIX=$(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 \
--arch=$ARCH \
--cpu=$CPU \
--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- \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $ISYSROOT -D__ANDROID_API__=$API -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
启动编译
打开 命令终端,cd 到ffmpeg-4.2.3目录,执行 build_clang_arm.sh。