Linux 下编译ffmpeg android so库
1、下载ffmpeg和NDK
ffmpeg使用4.2.2为例,先下载到linux
wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.gz
解压到当前目录
tar -zxvf ffmpeg-4.2.2.tar.gz
NDK使用21Linux版本
在这个地址使用手动下载 完成后再放到linux中
https://developer.android.google.cn/ndk/downloads/
下载完成后解压
unzip android-ndk-r21e-linux-x86_64.zip
上面都解压完的效果:
2、配置文件
1、修改so文件的命名规则,默认so库命名:文件名+.so+三段版本号的格式比如 libavformat.so.57.0.101,这样的格式我们无法直接使用,所以需要修改成xxx.so样式,去掉后面的版本
进入到ffpemg目录,修改configure文件
cd ffmpeg-4.2.2
vim configure
打开configure文件后可以使用 /+关键字搜索定位到下面内容位置(我使用/SLIBNAME_WITH_MAJOR进行定位)
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)'
这样就修改了so的命名
3、新增编译文件
新建一个用了编译so库的文件android_build.sh
vim android_build.sh
把下面内容复制进去,下面包含了arm\x86平台的编译,一次只能编译一个,通过注释完成不同平台的编译
#!/bin/bash
NDK=/home/mirrer/work/ffmpeg/android-ndk-r21e #这个是ndk目录根据前面下载的目录修改
HOST_TAG=linux-x86_64
#HOST_TAG 的值根据系统修改
#macOS darwin-x86_64
#Linux linux-x86_64
#32-bit Windows windows
#64-bit Windows windows-x86_64
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
API=21
function build_android
{
echo "Compiling FFmpeg for $CPU and prefix is $PREFIX" #这里会打印出编译后so库的目录
./configure \
--prefix=$PREFIX \ #配置so库编译后的目录
--disable-x86asm \
--disable-neon \
--disable-hwaccels \
--disable-gpl \
--disable-postproc \
--enable-shared \ #打开编译成动态库
--enable-jni \ #打开jni 通过 jni 调用 java 调用 硬解码
--disable-mediacodec \
--disable-decoder=h264_mediacodec \ #关闭指定编码
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \ #指定编译器
--target-os=android \ #编译完成后在android系统中运行
--arch=$ARCH \ #指定CPU架构
--cpu=$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 -j2
# make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
# arm64-v8a aarch64-linux-android
# ARCH=arm64
# CPU=armv8-a
# TRIPLE=aarch64-linux-android
# STRIP=aarch64-linux-android
# OPTIMIZE_CFLAGS="-march=$CPU"
# armeabi-v7a armv7a-linux-androideabi
ARCH=arm
CPU=armv7-a
TRIPLE=armv7a-linux-androideabi
STRIP=arm-linux-androideabi
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
echo "set arm cup"
# # x86 i686-linux-android
# ARCH=x86
# CPU=x86
# TRIPLE=i686-linux-android
# STRIP=i686-linux-android
# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
# x86-64 x86_64-linux-android
# ARCH=x86_64
# CPU=x86-64
# TRIPLE=x86_64-linux-android
# STRIP=x86_64-linux-android
# OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
CC=$TOOLCHAIN/bin/$TRIPLE$API-clang
CXX=$TOOLCHAIN/bin/$TRIPLE$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/$HOST_TAG/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/$STRIP-
PREFIX=$(pwd)/android/$CPU
function build
{
build_android
echo "start make"
make clean
make -j4
echo "start make install"
make install
echo "make finish"
}
build
等待编译完成后 so文件默认会在当前目录/android/armv7-a下
到此so库编译完成