1 资源下载
FFmpeg 4.3.2
Android NDK 21.4.7075529
2 环境配置
2.1 FFmpeg 的配置修改
由于 Android 平台的命名规则问题,默认配置下编译出来的 so 库 Android 无法识别,所以要对其输出文件命名进行更改。在 FFmpeg 的根目录下,找到 configure 文件。
# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
# 替换成如下
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
3 FFmpeg 编译脚本
3.1 编译 FFmpeg
首先需要编译 FFmpeg,生成部分代码 ./configure
。
3.2 编译动态库 .so
#用于编译安卓平台的脚本
#!/bin/bash
#定义几个变量
ARCH=arm
CPU=armv7-a
export NDK_PATH=/Users/karashokz/Library/Android/sdk/ndk/21.4.7075529
PREFIX=$(pwd)/android/$ARCH/$CPU
ADDI_CFLAGS="-marm -mno-stackrealign"
TOOLCHAIN=$NDK_PATH/toolchains/arm-linux-androideabi-4.9
ANDROID_TOOLCHAINS_PATH=$NDK_PATH/toolchains/llvm/prebuilt/darwin-x86_64
CROSS_PREFIX=$ANDROID_TOOLCHAINS_PATH/bin/arm-linux-androideabi-
SYSROOT=$ANDROID_TOOLCHAINS_PATH/sysroot
#用CC变量和CXX变量指定Cmake使用的编译器
#没有export,就相当于脚本的临时变量
#加了export,就变成了当前会话的环境变量
export CC=$ANDROID_TOOLCHAINS_PATH/bin/armv7a-linux-androideabi23-clang
export CXX=$ANDROID_TOOLCHAINS_PATH/bin/armv7a-linux-androideabi23-clang++
#执行 .configure文件
./configure --prefix=$PREFIX \
--enable-gpl \
--disable-static \
--enable-shared \
--enable-small \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--arch=$ARCH \
--cpu=$CPU \
--cross-prefix=$CROSS_PREFIX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--target-os=android \
--extra-cflags="-Os -fpic -mno-stackrealign" \
--extra-ldflags="$ADDI_LDFLAGS" \
--cc=$CC \
--cxx=$CXX \
--disable-x86asm \
#运行 Makefile
make clean
make
make install
将该文件放入 FFmpeg 的跟目录下,命名为 build_android.sh。命令行进入该目录执行 ./build_android.sh
命令。
如果报 Permission denied
,执行 sudo chmod +x build_android.sh
,在执行上面的命令。
成功后,在 FFmpeg 的根目录下会多一个 Android 的文件夹。
3.3 编译静态库 .a
将上面的脚本:
--enable-shared \
--disable-static \
改为:
--disable-shared \
--enable-static \
重新执行 build_android.sh 脚本即可。
4 踩坑
- 脚本中不能多空格,命令要打对,特别是在 copy 环境路径的时候。
- FFmpeg 的本班要和 NDK 的版本匹配。因为 NDK 编译 FFmpeg 的时候涉及交叉编译。