音视频系列:FFmpeg和NDK在Centos7上交叉编译

更新:

2022.01.15:因应用商店需要上传64位APK,发现之前的脚本编译的arm64-v8a库,在使用时报错:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "ff_vp9_copy32_aarch64" referenced by "/data/app/xxxxxxxxxxxxx==/lib/arm64/libavcodec.so"

解决:修改编译脚本打开neon,修改后三个CPU架构都需要重新编译,文章中的脚本已修改;

--enable--neon

目标:

使用Centos 7编译出Android使用的FFmpeg的so库

准备:

  • FFmpeg源码:本文示例用的是版本4.2.5
  • Android NDK: 本文示例用的是版本android-ndk-r20b,选择对应版本的下载就行。
  • 注意:ndk18及以下用的是gcc编译的,ndk19及以上是用clang编译的,版本不一样编译脚本是不一样的。

解压源码:

如上图,命令行进入放ffmpeg下载的源码位置,我的路径为/usr/ffmpeg

执行解压命令:

tar -jxvf ffmpeg-4.2.5.tar.bz2

ffmpeg解压后,解压ndk,执行命令:

unzip android-ndk-r20b-linux-x86_64.zip

因我将NDK源码也放在ffmpeg目录下,所以就直接在当前路径解压了。

修改FFmpeg文件:

 1、修改ffmpeg的configure:

进入解压后的ffmpeg目录:

cd ffmpeg-4.2.5

打开configure文件:

vim configure

进入编辑页面后输入“/” 查找“SLIBNAME_WITH_MAJOR”,在3722行左右修改4个值

修改前:

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)'

修改后:输入法为英文:点击键盘“i”,进入编辑模式,用“#”注释掉原4项,改为新的

# 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)'

改完后按“esc”后,输入":wq"保存退出;

若没安装过yasm,可以安装yasm(其他博客教程中有的要安装yasm,加速编译)。

brew install yasm

配置build_android.sh文件

在ffmepg-4.2.5目录下,新建build_android.sh文件:

vim build_android.sh

使用vim命令,复制粘贴以下代码:

#!/bin/bash
 
# 修改为自己的NDK的解压路径
NDK=/usr/ffmpeg/android-ndk-r20b
# macOS需要修改linux-x86_64为arch什么的,linux-x86_64是centos上用的
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

API=21

function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
    --prefix=$PREFIX \
    --enable-neon \
    --disable-hwaccels \
    --disable-gpl \
    --disable-postproc \
    --enable-shared \
    --enable-jni \
    --enable-small \
    --disable-mediacodec \
    --disable-decoder=h264_mediacodec \
    --disable-static \
    --disable-doc \
    --disable-programs \
    --disable-encoders \
    --disable-muxers \
    --disable-filters \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-avdevice \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC \
    --cxx=$CXX \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
 
#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
 
#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
build_android
 
#x86
# ARCH=x86
# CPU=x86
# CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
# CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
# SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
# CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
# PREFIX=$(pwd)/android/$CPU
# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
# build_android
 
#x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
build_android

保存退出“:wq”后,给build_android.sh添加执行权限:

chmod +x build_android.sh

至此配置完成。

编译so文件:

命令执行:

./build_android.sh

编译过程时间比较长,上边配置文件编译3个平台,大约6分钟左右。

编译完成后会在ffmpeg-4.2.5下生成android文件夹,里面有三个平台的so库。

 至此编译so完成。

编译好的文件放CSDN了:编译好的三个架构的so和头文件,使用的ndk-r21e,其他配置都一样

参考:



NDK r20b ffmpeg 编译脚本 build_android.sh_果光的博客-CSDN博客_build-android.sh

build ffmpeg for Android - 简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值