适用于 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 等)。
- 在 Android NDK 和 Gradle 中,目录名通常为
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 目录,实际编译结果完全一致。
- 例如:FFmpeg 的
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. 实践建议
-
编译 FFmpeg 时:
- 使用
--arch=arm64
,无需改为arm64-v8a
(FFmpeg 内部已适配)。 - 确保 NDK 工具链前缀匹配(如
aarch64-linux-android-
)。
- 使用
-
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
。