FFmpeg-NDK交叉编译

重新发布原因:因为NDK r19之后已弃用生成独立工具链,改用内置工具链,而之前脚本是基于NDK r18b编译的。参看NDK 修订历史记录

每当谈及音视频编程,一定绕不开FFmpeg。FFmpeg没有提供Android的SDK供下载,好在它是跨平台的,可以用NDK交叉编译。

NDK交叉编译需要注意的是:在NDK r19之后独立工具链(已弃用), 用NDK默认安装的工具链替代。交叉编译时不再需要使用make_standalone_toolchain.py脚本。随着Android 12的发布,NDK r23也发布了,工具链也有不少变化,下面内容基于NDK r23。

NDK默认安装的工具链路径:$NDK_HOME/toolchains/llvm/prebuilt/$HOST_TAG/bin/

$HOST_TAG参看下表:

NDK操作系统变体 主机标记
macOS darwin-x86_64
Linux linux-x86_64
32 位 Windows windows
64 位 Windows windows-x86_64

shell脚本(基于NDK r23)

 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
70
71
72
73
74
75
76
77
78
#!/usr/bin/env bash
#git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg && \


CUR_DIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd )
OUT_DIR=${CUR_DIR}/ffmpeg_build


#生成工具链。 NDK r19 已弃用 https://developer.android.google.cn/ndk/guides/other_build_systems
#if [ -d ${TOOLCHAIN_PATH} ];
#then
#    echo "Has toolchain !!"
#    #rm -r ${TOOLCHAIN_PATH}
#else
#    ${NDK_HOME}/build/tools/make_standalone_toolchain.py --arch arm64 --api 30 --install-dir ${TOOLCHAIN_PATH} --force -v
#fi
# 将独立工具链中的工具包添加到系统环境变量中
#export PATH=${TOOLCHAIN_PATH}/bin:$PATH

if [ -d ${OUT_DIR} ]; then
    rm -r ${OUT_DIR}
fi


TOOLCHAIN_PREFIX="${NDK_HOME}/toolchains/llvm/prebuilt/darwin-x86_64/bin"

export CROSS_PREFIX=${TOOLCHAIN_PREFIX}/aarch64-linux-android31
export AR=${TOOLCHAIN_PREFIX}/llvm-ar
export NM=${TOOLCHAIN_PREFIX}/llvm-nm
export STRIP=${TOOLCHAIN_PREFIX}/llvm-strip
export RANLIB=${TOOLCHAIN_PREFIX}/llvm-ranlib


cd ffmpeg &&\


./configure \
    --prefix=${OUT_DIR} \
    --libdir=${OUT_DIR}/arm64-v8a \
    --arch=aarch64 \
    --cpu=armv8-a \
    --arch=aarch64 \
    --nm=${NM} \
    --ar=${AR} \
    --ranlib=${RANLIB} \
    --strip=${STRIP} \
    --cross-prefix=${CROSS_PREFIX}- \
    --target-os=android \
    --extra-ldexeflags=-pie \
    --disable-static \
    --enable-shared \
    --disable-doc \
    --disable-programs \
    --disable-avdevice \
    --disable-swscale \
    --disable-postproc \
    --disable-symver \
    --disable-encoders \
    --disable-decoders \
    --enable-decoder=flac,ape,mp3 \
    --disable-protocols\
    --enable-protocol=file \
    --disable-muxers \
    --disable-demuxers \
    --enable-demuxer=flac,ape,mp3 \
    --enable-cross-compile \
    --disable-indevs \
    --disable-outdevs \
    --enable-small \
    --enable-jni\
    && \
make clean && \
make -j4 && \
make install


#./configure --list-decoders  查看支持的解码器
#./configure --list-protocols  查看支持的协议

其他

build-ffmpeg.sh configure命令参数
Google的编译脚本

Built with Hugo
主题 StackJimmy 设计