FFmpeg 编译 (For Android)
2025-10-11
FFmpeg 编译 (For Android)
源码仓库 - https://github.com/FFmpeg/FFmpeg
NDK下载 - https://developer.android.com/ndk/downloads?hl=zh-cn
环境说明
LINUX 环境: Ubuntu 22.04.3 LTS,
Linux server 5.15.0-157-generic #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
NDK版本: |Linux 64 位 (x86) |android-ndk-r29-linux.zip|783549481 |87e2bb7e9be5d6a1c6cdf5ec40dd4e0c6d07c30b|
FFmpeg 版本: FFmpeg-n7.1.2.zip
Building FFmpeg from source for Android on Linux
在 QT 官方居然有教程, 可以参考下 - https://doc.qt.io/qt-6/qtmultimedia-building-ffmpeg-android-linux.html
环境依赖
cmake
apt install clang
apt install make
To install the required packages (including Yasm for FFmpeg), run:
apt-get install yasm
安装 OpenSSL 库
apt-get install libssl-dev
它跟编译 --enable-openssl 相关, 启用对 OpenSSL 加密库的支持。这个选项主要主要是安全协议支持
- 启用 HTTPS/HTTPs 流媒体传输
- 支持 RTMPS (安全版 RTMP 协议)
- 支持加密的 HLS 流(m3u8 播放列表)
- 启用 TLS/SSL 加密的 RTP/RTSP 传输
环境变量
https://doc.qt.io/qt-6/qtmultimedia-building-ffmpeg-android-linux.html#set-environment-variables
# NDK 的配置
export ANDROID_NDK_ROOT=/opt/android-ndk-r29/
export ARCH=aarch64
export TOOLCHAIN_ARCH=aarch64-linux-android
export CPU=armv8-a
export API=24
# 测试下 有无设置成功
echo $ANDROID_NDK_ROOT
echo $TOOLCHAIN_ARCH
对于 CPU 架构
- aarch64
export ARCH=aarch64
export TOOLCHAIN_ARCH=aarch64-linux-android
export CPU=armv8-a
- armv7
export ARCH=armv7
export TOOLCHAIN_ARCH=armv7a-linux-androideabi
export CPU=armv7-a
- x86
export ARCH=x86
export TOOLCHAIN_ARCH=i686-linux-android
export CPU=i686
- x86_64
export ARCH=x86_64
export TOOLCHAIN_ARCH=x86_64-linux-android
export CPU=x86-64
FFmpeg 配置
创建编译目录
- 以 FFmpeg的源码在
/opt/FFmpeg-n7.1.2实例
mkdir /opt/FFmpeg-n5.1.6/build-for-android_arm64 -p
cd /opt/FFmpeg-n5.1.6/build-for-android_arm64
mkdir /opt/FFmpeg-n7.1.2/build-for-android_arm64 -p && cd /opt/FFmpeg-n7.1.2/build-for-android_arm64
To configure FFmpeg
默认
../configure --prefix=../install-android --disable-doc --enable-network --enable-shared \
--host-os=linux-x86_64 --target-os=android \
--enable-cross-compile --arch=${ARCH} --cpu=${CPU} \
--enable-jni --enable-mediacodec \
--sysroot=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
--sysinclude=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/ \
--cc=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/${TOOLCHAIN_ARCH}${API}-clang \
--cxx=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/${TOOLCHAIN_ARCH}${API}-clang++ \
--strip=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip
精简
aarch64选项
默认编译出来太大了
只保留 RTSP 协议 , H.264 编解码, MSE fmp4, flv 支持
export ANDROID_NDK_ROOT=/opt/android-ndk-r29
export ARCH=aarch64
export CPU=armv8-a
export TOOLCHAIN_ARCH=aarch64-linux-android
export API=24
export TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
export SYSROOT=$TOOLCHAIN/sysroot
export CC=$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang
export CXX=$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang++
export LD=$CC
export STRIP=$TOOLCHAIN/bin/llvm-strip
../configure \
--prefix=../install-android-arm64 \
--disable-everything \
--enable-protocol=rtsp \
--enable-protocol=tcp \
--enable-protocol=udp \
--enable-demuxer=rtsp \
--enable-muxer=mov \
--enable-muxer=mp4 \
--enable-muxer=ismv \
--enable-muxer=flv \
--enable-parser=h264 \
--enable-decoder=h264 \
--enable-bsf=h264_mp4toannexb \
--enable-bsf=extract_extradata \
--enable-avformat \
--enable-avcodec \
--enable-avutil \
--enable-network \
--enable-jni \
--enable-mediacodec \
--enable-cross-compile \
--arch=${ARCH} \
--cpu=${CPU} \
--target-os=android \
--sysroot=$SYSROOT \
--cc=$CC \
--cxx=$CXX \
--strip=$STRIP \
--enable-shared \
--disable-static \
--disable-doc \
--disable-debug \
--disable-programs \
--disable-avdevice \
--disable-postproc \
--disable-filters \
--extra-cflags="-fPIC -Os -ffunction-sections -fdata-sections" \
--extra-ldflags="-Wl,--gc-sections" \
--host-cc=/usr/bin/clang
| 配置项 | 作用 |
|---|---|
--disable-everything |
一次性关闭所有功能(协议、复用器、解码器等),从零开始启用需要的部分 |
--enable-protocol=rtsp,tcp,udp |
RTSP 拉流必须依赖 TCP/UDP |
--enable-demuxer=rtsp,h264 |
只支持 RTSP 与 H.264 解复用 |
--enable-decoder=h264 |
启用 H.264 解码器 |
--enable-encoder=libx264 |
若要编码(推流或转码),需另行指定 --enable-libx264 并链接外部 x264 |
--enable-avformat,avcodec,avutil |
核心库,必须 |
--enable-swresample,swscale |
音视频格式转换支持(常用基础) |
--disable-programs |
不编译 ffmpeg/ffplay/ffprobe 等可执行文件 |
--disable-debug |
去除调试符号 |
--disable-doc |
不编译文档 |
--extra-cflags 与 --extra-ldflags |
优化编译体积:-Os(体积优化),--gc-sections(移除未使用函数) |
--enable-jni / --enable-mediacodec |
Android 硬解码支持(可选) |
正常应该输出如下:
install prefix ../install-android-arm64
source path src
C compiler /opt/android-ndk-r29/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang
C library bionic
host C compiler /usr/bin/clang
host C library glibc
ARCH aarch64 (armv8-a)
big-endian no
runtime cpu detection yes
NEON enabled yes
DOTPROD enabled yes
I8MM enabled yes
debug symbols no
strip symbols yes
optimize for size no
optimizations yes
static no
shared yes
postprocessing support no
network support yes
threading support pthreads
safe bitstream reader yes
texi2html enabled no
perl enabled yes
pod2man enabled yes
makeinfo enabled no
makeinfo supports HTML no
xmllint enabled no
External libraries:
jni mediacodec zlib
External libraries providing hardware acceleration:
cuda_llvm v4l2_m2m
Libraries:
avcodec avformat swresample
avfilter avutil swscale
Programs:
Enabled decoders:
h264
Enabled encoders:
Enabled hwaccels:
Enabled parsers:
ac3 h264
Enabled demuxers:
asf mpegts rtsp
mov rm
Enabled muxers:
ismv mov mp4
Enabled protocols:
http tcp
rtp udp
Enabled filters:
Enabled bsfs:
aac_adtstoasc h264_mp4toannexb
extract_extradata vp9_superframe
Enabled indevs:
Enabled outdevs:
License: LGPL version 2.1 or later
WARNING: Option --enable-protocol=rtsp did not match anything
WARNING: pkg-config not found, library detection may fail.
libavutil/avconfig.h is unchanged
x86 选项
mkdir /opt/FFmpeg-n7.1.2/build-for-android-x86_64 -p
cd /opt/FFmpeg-n7.1.2/build-for-android-x86_64
export ANDROID_NDK_ROOT=/opt/android-ndk-r29
export ARCH=x86_64
export CPU=x86-64
export TOOLCHAIN_ARCH=x86_64-linux-android
export API=24
export TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
export SYSROOT=$TOOLCHAIN/sysroot
export CC=$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang
export CXX=$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang++
export LD=$CC
export STRIP=$TOOLCHAIN/bin/llvm-strip
../configure --prefix=../install-android-x86_64 --disable-everything --disable-doc --disable-static --enable-shared --disable-programs --enable-protocol=rtsp --enable-protocol=tcp --enable-protocol=udp --enable-demuxer=rtsp --enable-muxer=mov --enable-muxer=mp4 --enable-muxer=ismv --enable-parser=h264 --enable-decoder=h264 --enable-bsf=h264_mp4toannexb --enable-bsf=extract_extradata --enable-avformat --enable-avcodec --enable-avutil --enable-network --enable-jni --enable-mediacodec --enable-cross-compile --arch=${ARCH} --cpu=${CPU} --target-os=android --sysroot=$SYSROOT --cc=$CC --cxx=$CXX --strip=$STRIP --enable-shared --disable-static --disable-doc --disable-debug --disable-avdevice --disable-postproc --disable-filters --extra-cflags="-fPIC -Os -ffunction-sections -fdata-sections" --extra-ldflags="-Wl,--gc-sections" --host-cc=/usr/bin/clang
执行编译
Once the configure command finishes, build and install FFmpeg using the make command.
make -j install
成功后输出目录在 /opt/FFmpeg-n7.1.2/install-android/
动态库 /opt/FFmpeg-n7.1.2/install-android/lib/
头文件 /opt/FFmpeg-n7.1.2/install-android/include/
踩坑指南
- Host compiler lacks C11 support?
../configure 配置时 Host compiler lacks C11 support 原因编译器不支持 C11 特性
再装一下 更新...
apt install clang
apt install make
- C compiler test failed
/bin/x86_64-linux-android-clang is unable to create an executable file.
C compiler test failed.
是因为交叉编译器(NDK clang)路径或 sysroot 配置错误,导致 FFmpeg 的 configure 脚本无法正常生成并运行最小可执行程序。
确保 NDK clang 可用:
$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang -v

浙公网安备 33010602011771号