当前位置: 首页 > news >正文

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-gnulinuxaarch64-linux-gnu-
​Windows (x86_64)​mingw-w64mingw64x86_64-w64-mingw32-
​Android (arm64)​NDK clangandroidaarch64-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. 区别与联系​

​对比项​arm64arm64-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-v7aARMv7-A32 位 ARM(已逐步淘汰)
arm64-v8aARMv8-A64 位 ARM(当前主流)
x86_64x86-6464 位 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

相关文章:

  • 2025AIGC终极形态:多模态(文本/图像/音乐/视频)系统整合
  • 开源软件与自由软件:一场理念与实践的交锋
  • 2024 天梯赛——工业园区建设题解
  • CF2075D Equalization
  • 代码随想录算法训练营Day21
  • Py一阶段习题汇总
  • 微型导轨的制造工艺中,热处理的目的是什么?
  • 202521 | 远程调用 | 注册中心
  • Go语言-初学者日记(六) 并发编程
  • Nginx-keepalived-高可用
  • cpp经典数论问题
  • celsius与Fahrenheit
  • C++ STL 详解 ——list 的深度解析与实践指南
  • leetcode120.三角形最小路径
  • 小刚说C语言刷题——第16讲 switch语句
  • C++11详解
  • Spring Boot 与 TDengine 的深度集成实践(三)
  • 利用C++编写操作OpenCV常用操作
  • 编程速递-Delphi is 30 Delphi诞生30周年!
  • MySQL-SQL-DQL语句、DQL基本查询、DQL条件查询、DQL分组查询、聚合函数、DQL排序查询、DQL分页查询
  • 怎么看网站pr值/百度普通收录
  • 哪些女性网站做女性慈善事业/b站不收费网站
  • 怎么做网站链接支付/网站如何做推广
  • 秦皇岛市海港区建设局网站/全网营销推广软件
  • 简要说明网站建设的步骤/公司网站建设哪个好
  • 网站设计网页配色/seo推广软件