在 Linux 上为 Android 从源代码构建 FFmpeg

本页介绍如何配置和构建适用于 Android 的FFmpeg。针对 Android 的编译是交叉编译,假定使用 Linux 作为主机系统。所需步骤如下

  • 获取 FFmpeg 源代码。
  • 安装所需的依赖项。
  • 从命令行配置 FFmpeg。
  • 构建开发库。

获取 FFmpeg 源代码

您可以通过以下方式获取 FFmpeg 源代码:

  • FFmpeg 下载页面下载
  • 从 git 克隆。例如,此命令将 7.1.1 版的 FFmpeg 源代码克隆到~/ffmpeg
    git clone --branch n7.1.1 https://git.ffmpeg.org/ffmpeg.git ffmpeg

建议使用与Qt Multimedia 主页中记录的相同的 FFmpeg 版本。

以下段落假定您将 FFmpeg 源代码存储在~/ffmpeg 下。

先决条件

要构建 FFmpeg,需要以下工具和软件包:

  • Yasm.
  • 您选择的安全后端开发包(见下文)。

您还需要安装和配置 Android NDK、SDK 和 JDK。有关这些设置的更多信息,请点击Android 版 Qt 入门

安装软件包

要安装所需的软件包(包括用于 FFmpeg 的 Yasm),请运行:

apt-get install yasm

此外,如果要启用安全后端,还需要相应的开发者软件包:

apt-get install libssl-dev

对于其他后端,请安装相关软件包:

  • 对于 OpenSSL:libssl-dev
  • 对于 GnuTLS:libgnutls-dev
  • 对于 LibreSSL (libtls):libtls-dev.
  • 对于 MbedTLS:libmbedtls-dev

设置环境变量

这部分并非严格必要,但有助于使 configure 命令更简洁。

以下命令假定 Andorid SDK 已安装到~/Android/sdk ,Android NDK 版本为 26.1.10909125。

export ANDROID_NDK_ROOT=~/Android/sdk/ndk/26.1.10909125

建议使用与《Android 版 Qt 入门》中记录的相同的 NDK 版本。

您应构建的架构取决于目标设备:

  • aarch64 (ARM64-v8a):被大多数现代 Android 设备(64 位)使用。
  • armv7 (armeabi-v7a):用于较旧的 32 位 ARM 设备。
  • x86:主要用于在英特尔处理器上运行的安卓模拟器。
  • x86_64:适用于基于英特尔处理器的 64 位模拟器或专用设备。

设置特定架构变量

  • 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 目录内创建build-android 目录并导航进入:

mkdir ~/ffmpeg/build-android
cd ~/ffmpeg/build-android

要配置 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}24-clang \
    --cxx=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/${TOOLCHAIN_ARCH}24-clang++ \
    --strip=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip

--prefix 参数指定了构建后安装 FFmpeg 开发库的路径。不需要文档,但应启用网络功能。要将 FFmpeg 作为静态库构建,请省略--enable-shared 选项。

如果要使用安全后端构建 FFmpeg,有 4 个选项可供选择(与为 Linux 构建时相同),但目前只有 OpenSSL 由QtMultimedia 维护者测试。请选择合适的选项,并在配置 FFmpeg 时添加它:

--enable-openssl # For OpenSSL
--enable-gnutls # For GnuTLS
--enable-libtls # For LibreSSL (libtls)
--enable-mbedtls # For MbedTLS

如果使用 OpenSSL,还需要在 FFmpeg 配置中添加以下选项。不要忘记将<ANDROID_OPENSSL_INCLUDE_DIR><ANDROID_OPENSSL_LIBS_DIR> 替换为实际路径。

--extra-cflags=-I<ANDROID_OPENSSL_INCLUDE_DIR> --extra-ldflags=-L<ANDROID_OPENSSL_LIBS_DIR>

如果包含安全后端,则应自行处理其交付问题,确保在目标平台上安装了正确的库或使用存根。链接的 OpenSSL 库必须称为libssl.solibcrypto.so ,不含任何版本后缀。用户必须确保库的 ABI 版本与编译 FFmpeg 时使用的 OpenSSL 头文件相同。更多信息,请参阅为 Android 添加 OpenSSL 支持

configure 命令完成后,使用make 命令构建并安装 FFmpeg。

make -j install

如果编译无误,FFmpeg 开发库将安装在../install-android 目录中。如果编译Qt Multimedia ,该路径将存储在配置Qt Multimedia 时使用的FFMPEG_DIR 变量中。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.