参考 Android-NDK-clang 编译 FFmpeg - 知乎 文章,编译成功
前期准备
1、下载Android-NDK(开魔法可能访问速度会更快一点)
2、下载 FFmpeg源码,注意:我用的是 NDK-21(android-ndk-r21e-linux-x86_64)
和 ffmpeg-4.4
(ffmpeg-4.2.4.tar.gz)进行编译,如果版本不同可能会有所不同。
测试:ubuntu20 的NDK20 - NDK22
和 ffmpeg 4.0 - ffmpeg 4.4
,均可使用。
使用 clang
交叉编译出 Android 平台可以使用的 libffmpeg.so 库
进入 FFmpeg 源码根目录
1.创建编译脚本:build_ffmpeg_android.sh
脚本的主要内容如下:
#!/bin/sh
# NDK 所在的路径
NDK=/Users/mac/Library/Android/sdk/ndk/21.4.7075529
# 需要编译出的平台,这里是 arm64-v8a
ARCH=aarch64
# 支持的最低 Android API
API=21
# 编译后输出目录,在 ffmpeg 源码目录下的 /android/arm64-v8a
OUTPUT=$(pwd)/android/arm64-v8a
# NDK 交叉编译工具链所在路径
TOOLCHAIN=/Users/mac/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64
build() {
./configure \
--target-os=android \
--prefix=$OUTPUT \
--arch=$ARCH \
--sysroot=$TOOLCHAIN/sysroot \
--disable-static \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-debug \
--disable-doc \
--disable-avdevice \
--enable-shared \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--cc=$TOOLCHAIN/bin/aarch64-linux-android$API-clang \
--cxx=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++ \
--extra-cflags="-fpic"
make clean all
make -j12
make install
}
build
注意,如果需要用到 device相关,需要把以上代码中的 --disable- -avdevice删除。
这个shell脚本,大体上其实还是很容易懂的,比如--disabble-static
禁止输出静态库--enable-shared
输出动态库--arch
用于配置输出的so库是什么架构的--prefix
用于配置输出的so库的存放路径enable-cross-compile
开启多平台编译,也就是可以编译多个平台的库
更多的选项可以查看官网的介绍
2.开始编译
通过终端进入到 FFmpeg 源码根目录
,并运行刚刚写好的编译脚本
// 出现 ”bash: ./build_ffmpeg_android.sh: 权限不够” 报错
chmod +x build_ffmpeg_android.sh
./build_ffmpeg_android.sh
注意,有莫名的报错,可能是因为Windows下的换行符导致无法正确识别,尝试使用dos2unix工具
sudo apt install dos2unix
运行结果如下
最终需要目录中的lib, .so库