基于 Android 编译 FFmpeg

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 踩坑

  1. 脚本中不能多空格,命令要打对,特别是在 copy 环境路径的时候。
  2. FFmpeg 的本班要和 NDK 的版本匹配。因为 NDK 编译 FFmpeg 的时候涉及交叉编译。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值