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

适用于 ​​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。
相关推荐
xh didida11 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
zly350012 小时前
centos7 mount设备挂载 /dev/sda1/硬盘挂载
linux·运维·服务器
工业一体机老司机12 小时前
工业一体机选购后的系统部署:Ubuntu下Docker容器化运行与GPIO配置
linux·ubuntu·docker·人机交互
哎呦,帅小伙哦12 小时前
进程监控工具——htop
linux·运维·服务器
夏虫不可与之言冰13 小时前
Windows WSL2 (Ubuntu) 搭建 ESP‑IDF 6.1 开发环境全过程演示
linux·windows·ubuntu·esp32·乐鑫科技·乐鑫eim·乐鑫代理商
春涧草茶14 小时前
慢就是快12-12手动抛出异常
java·linux·前端
KING-WU51215 小时前
Linux 工具之Make 与 Makefile
java·linux·服务器
Lsetea15 小时前
OpenSSL报certificate is not yet valid:error 9与notBefore时间排查
linux·运维·https·ssl证书·openssl
魔法阵维护师15 小时前
Linux 命令行入门踩坑记录:从 VMware 装系统到文件管理
linux·运维·服务器
Apipi*16 小时前
30天速通Linux 第七章进程间通信
linux·运维·服务器