交叉编译ffmpeg so库

下载ffmpeg库,本文以ffmpeg-4.2.3为例。

FFmpeg下载

编译工具链

对于C/C++的编译,通常有两个工具 GCC 和 CLANG 。这两个库的区别就不介绍了,感兴趣的同学自行查阅相关资料。
Google在 ndk 17 以后,把 GCC 移除了,全面推行使用 CLANG 。所以各位同学一定要注意自己的ndk环境。

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目录结构toolchains目录
2)sysroot目录结构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。

参考文章

【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值