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 配置

https://doc.qt.io/qt-6/qtmultimedia-building-ffmpeg-android-linux.html#configuring-and-building-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
posted @ 2025-11-08 11:22  daidaidaiyu  阅读(5)  评论(0)    收藏  举报