更新:
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