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 开发中,​arm64arm64-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
相关推荐
写代码的小王吧4 小时前
【安全】Web渗透测试(全流程)_渗透测试学习流程图
linux·前端·网络·学习·安全·网络安全·ssh
Tee xm5 小时前
清晰易懂的跨平台 MySQL 安装与配置教程
linux·windows·mysql·macos·安装
GalaxyPokemon5 小时前
MySQL基础 [一] - Ubuntu版本安装
linux·运维·ubuntu
musk12125 小时前
wsl2 配置ubuntu 固定ip
linux·tcp/ip·ubuntu
柳鲲鹏6 小时前
UBUNTU编译datalink
linux·运维·ubuntu
GalaxyPokemon6 小时前
Muduo网络库实现 [七] - Connection模块
linux·服务器·网络
the_nov7 小时前
19.TCP相关实验
linux·服务器·网络·c++·tcp/ip
Y淑滢潇潇8 小时前
RHCSA Linux 系统创建文件
linux·运维·服务器
University of Feriburg8 小时前
4-c语言中的数据类型
linux·c语言·笔记·学习·嵌入式实时数据库·嵌入式软件