Ubuntu 64-bit 交叉编译 FFmpeg(高级用户指南)

发布于:2025-04-07 ⋅ 阅读:(28) ⋅ 点赞:(0)

适用于 ​​ARM (aarch64)、Windows (mingw)、Android、Raspberry Pi​​ 等平台的交叉编译。


​🔹 1. 安装交叉编译工具链​

​ARM (aarch64) 示例​

sudo apt update
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu

​Windows (MinGW-w64) 示例​

sudo apt install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64

​Android (NDK) 示例​

wget https://dl.google.com/android/repository/android-ndk-r25b-linux.zip
unzip android-ndk-r25b-linux.zip
export NDK=/path/to/android-ndk-r25b

​🔹 2. 下载 FFmpeg 源码​

wget https://ffmpeg.org/releases/ffmpeg-7.1.tar.gz
tar -xf ffmpeg-7.1.tar.gz
cd ffmpeg-7.1

​🔹 3. 配置交叉编译环境​

​📌 ARM (aarch64) 交叉编译​

./configure \
    --arch=aarch64 \
    --target-os=linux \
    --cross-prefix=aarch64-linux-gnu- \
    --enable-cross-compile \
    --prefix=/usr/local/ffmpeg-aarch64 \
    --enable-shared \
    --disable-static \
    --enable-gpl \
    --enable-libx264 \
    --enable-libx265 \
    --enable-libfdk-aac \
    --enable-nonfree

​📌 Windows (MinGW-w64) 交叉编译​

./configure \
    --arch=x86_64 \
    --target-os=mingw64 \
    --cross-prefix=x86_64-w64-mingw32- \
    --enable-cross-compile \
    --prefix=/usr/local/ffmpeg-mingw \
    --enable-shared \
    --disable-static \
    --enable-gpl \
    --enable-libx264 \
    --enable-libx265 \
    --enable-libfdk-aac \
    --enable-nonfree

​📌 Android (NDK) 交叉编译​

./configure \
    --target-os=android \
    --arch=arm64 \
    --cc=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang \
    --cxx=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++ \
    --cross-prefix=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android- \
    --sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
    --prefix=/usr/local/ffmpeg-android \
    --enable-shared \
    --disable-static \
    --enable-gpl \
    --enable-libx264 \
    --enable-libx265 \
    --enable-libfdk-aac \
    --enable-nonfree

​🔹 4. 编译 & 安装​

make -j$(nproc) && sudo make install

编译完成后,二进制文件会安装到 --prefix 指定的目录(如 /usr/local/ffmpeg-aarch64)。


​🔹 5. 验证交叉编译结果​

​📌 ARM (aarch64)​

file /usr/local/ffmpeg-aarch64/bin/ffmpeg

​输出示例​​:

ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., stripped

​📌 Windows (MinGW)​

file /usr/local/ffmpeg-mingw/bin/ffmpeg.exe

​输出示例​​:

PE32+ executable (console) x86-64, for MS Windows

​📌 Android​

file /usr/local/ffmpeg-android/lib/libavcodec.so

​输出示例​​:

ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., stripped

​🔹 6. 高级选项(可选)​

​📌 自定义优化​

./configure \
    --enable-small \          # 最小化体积
    --disable-doc \           # 不编译文档
    --disable-ffplay \        # 不编译 ffplay
    --disable-ffprobe \       # 不编译 ffprobe
    --extra-cflags="-O3 -mcpu=cortex-a72"  # ARM 优化

​📌 静态编译(适用于嵌入式)​

./configure \
    --enable-static \
    --disable-shared \
    --extra-ldflags="-static"

​📌 总结​

平台 工具链 --target-os --cross-prefix
​ARM (aarch64)​ gcc-aarch64-linux-gnu linux aarch64-linux-gnu-
​Windows (x86_64)​ mingw-w64 mingw64 x86_64-w64-mingw32-
​Android (arm64)​ NDK clang android aarch64-linux-android-

✅ ​​适用于嵌入式设备、跨平台开发、性能优化场景​
🚀 ​​现在你可以把编译好的 FFmpeg 部署到目标设备了!

在 Android 开发中,​arm64 和 arm64-v8a 本质上是相同的架构​​,但术语的使用场景和规范性略有差异。以下是详细解释:


​1. 技术本质​

  • arm64
    是 ARM 64 位架构的通用简称,指代基于 ​​ARMv8-A​​ 及更高版本的 64 位处理器架构(如 Cortex-A53/A72/A76 等)。

    • 指令集:AArch64(64 位模式)。
    • 兼容性:所有支持 64 位的 Android ARM 设备均使用此架构。
  • arm64-v8a
    是 Android 官方定义的 ​​ABI(应用二进制接口)名称​​,明确指定了基于 ​​ARMv8-A​​ 的基础指令集。

    • 在 Android NDK 和 Gradle 中,目录名通常为 arm64-v8a(如 libs/arm64-v8a)。
    • 强调对 ARMv8-A 标准指令集的支持(如 NEON、CRC 等)。

​2. 区别与联系​

​对比项​ arm64 arm64-v8a
​定义方​ ARM 公司通用术语 Android 官方 ABI 名称
​使用场景​ 通用技术文档、命令行参数 Android NDK/Gradle 配置
​指令集范围​ 泛指 ARMv8-A 及以上 明确限定为 ARMv8-A 基础特性
​实际兼容性​ 等同于 arm64-v8a 等同于 arm64
  • ​关键结论​​:
    在 Android 环境下,两者指向相同的硬件架构,只是术语的规范性不同。
    • 例如:FFmpeg 的 --arch=arm64 配置和 Android Studio 的 arm64-v8a ABI 目录,实际编译结果完全一致。

​3. 常见问题​

​Q1: 是否需要区分使用?​
  • ​编译配置(如 FFmpeg)​​:使用 --arch=arm64(通用术语)。
  • ​Android 工程配置​​:使用 arm64-v8a(如 NDK 的 APP_ABI 或 Gradle 的 abiFilters)。
​Q2: 是否存在更高版本的 arm64-v9a?​
  • ​ARMv9-A​​ 是 ARM 新一代架构(如 Cortex-X2),但 Android 尚未定义对应的 arm64-v9a ABI。
  • 目前所有 Android 64 位 ARM 设备仍使用 arm64-v8a ABI,即使硬件支持 ARMv9 特性(如 SVE2)。
​Q3: 其他 ARM ABI 的命名规范​
​ABI 目录名​ ​架构​ ​说明​
armeabi-v7a ARMv7-A 32 位 ARM(已逐步淘汰)
arm64-v8a ARMv8-A 64 位 ARM(当前主流)
x86_64 x86-64 64 位 Intel/AMD(模拟器常用)

​4. 实践建议​

  1. ​编译 FFmpeg 时​​:

    • 使用 --arch=arm64,无需改为 arm64-v8a(FFmpeg 内部已适配)。
    • 确保 NDK 工具链前缀匹配(如 aarch64-linux-android-)。
  2. ​Android 项目中​​:

    • 在 build.gradle 中指定 ABI:

      gradle

      android {
          defaultConfig {
              ndk { abiFilters 'arm64-v8a' }
          }
      }
    • 动态库应放入 src/main/jniLibs/arm64-v8a/

​总结​

  • arm64​ 是技术术语,​arm64-v8a​ 是 Android 的标准化 ABI 名称,两者在 Android 环境下无实际区别。
  • 开发者只需根据场景选择术语:编译工具链用 arm64,Android 工程配置用 arm64-v8a

网站公告

今日签到

点亮在社区的每一天
去签到