使用NDK编译ffmpeg

最近研究音视频,ffmpeg 是一个非常著名的开源项目,分享一下自己从 0 到编译 ffmpeg 的过程,希望能帮助其他人趟坑。

很多的帖子都推荐编译 3.3.6 的版本,因为提到高版本都有编译不过的坑,所以我也是编译 3.3.6,NDK 是 android-ndk-r15c,其实编译部分的坑不多,不过,有些帖子的编译脚本编译出来时会少文件的,引入到 android 项目里面就各种报错。

以下编译流程在 linux 系统执行,与 macos 下差异不大
我编译使用的 NDK source.propertis

1
2
Pkg.Desc = Android NDK
Pkg.Revision = 15.2.4203891

ffmpeg 版本

1
3.36

platform version

1
android-21

ndk 下载路径:

macos

linux

ffmpeg:
3.3.6

很多帖子推荐使用 andoird-15,不过我看了我所有的 platform version,andorid-21 开始才支持 arm64 架构的编译

创建一个 build_andrid.sh

这个文件要在解压后的 ffmpeg 根目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/bin/bash
cd `dirname $0`
#临时缓存路径,如果使用一定要确保文件夹存在
export TMPDIR=/home/nightmare/文档/Android_Project/tempdir
#ndk的根目录
NDK=/home/nightmare/Android/Ndk/android-ndk-r15c
#以下就是一个编译执行的函数
configure()
{
#$1代表这个函数收到的第一个参数
CPU=$1
#输出目录
PREFIX=$(pwd)/android/$CPU
#编译平台版本
ARCH=""
#交叉编译可执行文件的头部分,在bin文件夹,有一系列arm-linux-androideabi-开头的可执行程序
#如arm-linux-androideabi-gcc,但编译时只需要它的头部部分
CROSS_PREFIX=""
#所选使用的编译版本路径
SYSROOT=""
if [ "$CPU" == "armv7-a" ]
then
ARCH="arm"
SYSROOT=$NDK/platforms/android-21/arch-arm/
CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
else
ARCH="aarch64"
SYSROOT=$NDK/platforms/android-21/arch-arm64/
CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
fi
echo "start build ffmpeg for $ARCH"
# #调用configure命令开始编译,并传入对应的参数
./configure --target-os=linux \
--prefix=$PREFIX --arch=$ARCH \
--disable-doc \
--disable-static \
--disable-yasm \
--disable-asm \
--disable-symver \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--cross-prefix=$CROSS_PREFIX \
--enable-cross-compile \
--enable-shared \
--enable-gpl \
--sysroot=$SYSROOT \
--enable-small \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}

build()
{
make clean
cpu=$1
echo "build $cpu"

configure $cpu
#-j<CPU核心数>
make -j8
make install
echo "build ffmpeg for $ARCH finished"
}

build arm64
# build armv7-a

这是我的环境使用的编译脚本,请务必将其中的环境变量改为自己环境对应的路径,已经补充上了很多注释,并且执行脚本的时候不需要手动切换 pwd 路径为 ffmpeg 根目录

最后两行极为一键编译的命令,只需要更改 build 后面的参数即可
注意如果需要直接执行

1
2
chmod 777 build_android.sh
./build_android.sh

或者

1
sh build_android.sh

附上我在 manjaro 的编译截图

作者

梦魇兽

发布于

2020-03-14

更新于

2023-03-11

许可协议

评论