编译环境:
- Mac OS monterey (12.3.1)
- android-ndk (21.0.6113669)
-
ffmpeg-4.2.2
下载ffmpeg:wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2 ,或者到官方git上下载。
注意:ndk版本我使用的是21.0.6113669,试过24.0.8215888的版本,缺少某些文件会导致编译失败。应该大版本是21的都可以,具体什么原因还没验证。
注意:Android 的 NDK 在 r17c 以后,Google正式移除 GCC ,不再支持 GCC ,新版本的 NDK 都是使用 CLANG 进行编译。所以我们这里使用CLANG进行编译。
一、 configure 脚本
新增 cross_prefix_clang 参数
打开(注:不是双击运行)ffmpeg-4.2.2 根目录下的 configure 文件,搜索 CMDLINE_SET ,可以找到以下代码,然后新增一个命令行选项:cross_prefix_clang
CMDLINE_SET="
$PATHS_LIST
ar
arch
as
assert_level
build_suffix
cc
objcc
cpu
cross_prefix
# 新增命令行参数
cross_prefix_clang
custom_allocator
cxx
dep_cc
doxygen
env
extra_version
.
.
.
2.修改编译工具路径设置,
搜索ar_default="${cross_prefix}${ar_default}"
ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix}${cc_default}"
cxx_default="${cross_prefix}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
将中间两行改成
ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix_clang}${cc_default}"
cxx_default="${cross_prefix_clang}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
新建编译配置脚本
在根目录下新建 shell 脚本,命名为: build_android_clang.sh
#!/bin/bash
set -x
# 目标Android版本
API=24
CPU=armv7-a
#so库输出目录,自己喜欢放哪里就放哪里
# OUTPUT=$(pwd)/android/$CPU
OUTPUT=./output/$CPU
# NDK的路径,根据自己的NDK位置进行设置
NDK=/Users/kbq/Library/Android/sdk/ndk/21.0.6113669
# 编译工具链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
# 编译环境
SYSROOT=$TOOLCHAIN/sysroot
function build
{
./configure \
--prefix=$OUTPUT \
--target-os=android \
--arch=arm \
--cpu=armv7-a \
--enable-asm \
--enable-neon \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffplay \
--disable-ffprobe \
--disable-symver \
--disable-ffmpeg \
--sysroot=$SYSROOT \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--cross-prefix-clang=$TOOLCHAIN/bin/armv7a-linux-androideabi$API- \
--extra-cflags="-fPIC"
make clean all
# 这里是定义用几个CPU编译
make -j12
make install
}
build
第三步启动编译
打开cmd终端,cd 到 FFmpeg 所在目录
输入 ./build_android_clang.sh
等待编译完成,将会在 ffmpeg/android/armv7-a目录下得到 include 和 lib 两个目录,分别是 头文件 和 so库文
注意:如果出现 zsh: permission denied: ./build_android_clang.sh 的错误提示,就是文件权限不对,执行 chmod u+x build_android_clang.sh