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
把下面内容复制进去,下面包含了armx86平台的编译,一次只能编译一个,通过注释完成不同平台的编译
#!/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库编译完成