ffmpeg-android-maker 轻量、模块化,且非常容易针对 NDK 27+ 和 Android 15 (16KB Page Size) 进行深度定制。
1、编译前环境准备
安装必要依赖:
brew install automake autoconf libtool pkg-config cmake ninja yasm nasm
确认ndk路径:
xxx/Android/sdk/ndk/27.0.12077973
2、下载并配置脚本
git clone https://github.com/Javernaut/ffmpeg-android-maker.git
cd ffmpeg-android-maker
export ANDROID_NDK_HOME=xxx/Android/sdk/ndk/27.0.12077973
3、Android 15以上 设备强制要求适配 16KB 内存页
指定了使用ndk27好像生成so已经适配16KB 内存页(待确认)。
否则找到 scripts 目录下的 ffmpeg/build.sh,在链接参数中添加
-Wl,-z,max-page-size=16384。
或者直接在执行脚本前通过环境变量注入:
export LDFLAGS=“-Wl,-z,max-page-size=16384"
4、执行编译命令
./ffmpeg-android-maker.sh \
--target-abis=arm64-v8a,armeabi-v7a \
--enable-x264 \
--enable-mediacodec \
—android-api-level=24
5、获取输出文件
编译完成后,所有的 .so 文件和头文件都会出现在: build/
6、验证 16KB 适配是否成功
xxx/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf -l xxx/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libavcodec.so | grep LOAD
所有LOAD段的Align值都是 0x4000 (16384字节 = 16KB), 这说明:已正确对齐:SO文件已经按照16KB页面大小进行对齐.
7、使用
加载顺序请遵循依赖链(从底层到高层)
System.loadLibrary("avutil")
System.loadLibrary("swresample") System.loadLibrary("swscale")
System.loadLibrary(“avcodec")
System.loadLibrary(“avformat")
System.loadLibrary("avfilter")
System.loadLibrary(“avdevice”)
8、模拟推流到android设备
ffmpeg -re -i xxx.mp4 -vcodec libx264 -preset ultrafast -tune zerolatency -g 25 -b:v 2000k -maxrate 2500k -bufsize 4000k -x264-params "repeat-headers=1:keyint=25" -f mpegts "udp://android设备IP:5000?pkt_size=1316"