FFmpeg 8.1(代号 “Heaviside”)是业界领先的音视频处理框架,支持编解码、转码、流媒体处理等核心功能。其模块化架构和跨平台特性,使其成为鸿蒙生态多媒体开发的关键基础设施。

一、前言

随着鸿蒙生态(OpenHarmony)的全面爆发,越来越多的多媒体应用需要自研播放器内核或音视频处理工具。FFmpeg 作为音视频领域的“瑞士军刀”,其最新的 8.1 版本(代号“Heaviside”)在多线程并发和 AArch64 指令集优化上有了显著提升。

然而,由于 OHOS 采用了 Musl C 标准库且工具链(LLVM/Clang)有特定的目录结构,传统的交叉编译配置往往会报出 C compiler test failed 或 crti.o not found 等错误。本文将手把手带您攻克这些难点。

移植成功截图:

在这里插入图片描述

1.1 核心价值

FFmpeg 8.1 在多线程并发AArch64指令集优化硬件加速方面显著提升。移植到鸿蒙PC平台(aarch64)将为视频编辑、直播推流等场景提供核心处理能力。

FFmpeg官网地址:https://ffmpeg.org/
源码仓库:https://github.com/FFmpeg/FFmpeg
源码下载地址:https://ffmpeg.org/download.html

1.2 项目信息
关键信息 技术参数
库名称 FFmpeg
开源协议 LGPL/GPL
源码版本 8.1 (n8.1.1)
目标平台 OpenHarmony PC (aarch64)
依赖项 鸿蒙NDK工具链、Musl库

二、适配设计

2.0 环境准备(Ubuntu 24.04)

工欲善其事必先利其器。首先需要准备好移植所需要的开发环境,即下载按照OHOS的SDK。

以Ubuntu 24.04为例:

1.安装需要的依赖包:

sudo apt install -y automake libtool

2.接下来下载并配置ohos-sdk:
从下面地址链接下载最新的ohos-sdk:

sdk_download_url="https://cidownload.openharmony.cn/version/Daily_Version/OpenHarmony_6.1.0.27/20260111_020523/version-Daily_Version-OpenHarmony_6.1.0.27-20260111_020523-ohos-sdk-public.tar.gz"
curl -o ohos-sdk-public.tar.gz $sdk_download_url
mkdir ohos-sdk
tar -zxf ohos-sdk-public.tar.gz -C ohos-sdk

cd ~/ohos-sdk/linux
#解压工具链
unzip native-linux-x64-6.0.0.46-Beta1.zip
unzip toolchains-linux-x64-6.0.0.46-Beta1.zip

这段代码的作用是从指定的 URL 下载 SDK 压缩包,然后创建一个名为 ohos-sdk 的目录,并将压缩包解压到该目录下。

2.1 移植技术挑战
  1. 工具链兼容性:鸿蒙专用Clang工具链与标准GCC差异
  2. 系统库依赖:Musl C库替代glibc的适配问题
  3. 硬件加速:Vulkan等图形接口缺失需绕过
  4. 交叉编译:复杂依赖链的精准路径配置
2.2 适配策略

常用的configure 配置脚本使用及含义介绍如下:

./configure \
  --target-os=linux \                     # 基础OS类型
  --arch=aarch64 \                        # 指定ARMv8架构
  --cc="$OHOS_CLANG" \                    # 鸿蒙专用Clang
  --cxx="$OHOS_CLANG++" \                 # C++编译器
  --sysroot="$OHOS_SYSROOT" \             # 系统根目录
  --extra-cflags="-D__OHOS__ -fPIC" \     # 鸿蒙专属宏定义
  --extra-ldflags="-fuse-ld=lld" \        # 强制LLD链接器
  --disable-vulkan \                      # 规避缺失图形接口
  --enable-cross-compile                  # 启用交叉编译

三、实现细节

接下来就是我们的实现细节。大体上总结就是先定义好环境变量,让环境可以认出来你配置的工具链和路径,及工具链上配置的平台相关参数。

3.1 环境配置
# 鸿蒙SDK路径(根据实际安装位置修改)
export OHOS_SDK="/opt/ohos-sdk/linux"
export COMPILER_TOOLCHAIN=${OHOS_SDK}/native/llvm/bin
export SYSROOT=${OHOS_SDK}/native/sysroot
export TARGET_ARCH="aarch64-linux-ohos"

# 关键环境变量
export CC="${COMPILER_TOOLCHAIN}/clang"
export CXX="${COMPILER_TOOLCHAIN}/clang++"
export AR="${COMPILER_TOOLCHAIN}/llvm-ar"
export LD="${COMPILER_TOOLCHAIN}/ld.lld"
3.2 编译脚本 (build_ffmpeg_ohos.sh)

上面的环境变量配置,其实可以整理成为通用配置。最核心的是针对该项目的编译脚本的编写。

#!/bin/bash
# 安装路径配置
FFMPEG_INSTALL_PATH="/data/service/hnp/ffmpeg.org/ffmpeg_8.1"

./configure \
  --prefix=${FFMPEG_INSTALL_PATH} \
  --target-os=linux \
  --arch=aarch64 \
  --cc="$CC" \
  --cxx="$CXX" \
  --sysroot="$SYSROOT" \
  --extra-cflags="--target=$TARGET_ARCH -D__OHOS__" \
  --extra-ldflags="--target=$TARGET_ARCH -fuse-ld=lld" \
  --enable-shared \
  --disable-static \
  --disable-vulkan \
  --disable-libdrm \
  --enable-gpl \
  --enable-nonfree \
  --enable-pic

make -j$(nproc) VERBOSE=1
make install

# 生成HNP包
cp hnp.json $FFMPEG_INSTALL_PATH
${OHOS_SDK}/toolchains/hnpcli pack -i $FFMPEG_INSTALL_PATH -o ./output/
完整脚本

为了方面一键编译,猫哥这里给出了本次编译的完整脚本:
(包含工具链的环境配置和最终的构建脚本)

#!/bin/bash
#file:build_ohos.sh
# ohos编译安装ffmpeg

# --- sdk路径配置 (请根据实际环境修改) ---
OHOS_SDK="/root/ohos-sdk/linux"

COMPILER_TOOLCHAIN=${OHOS_SDK}/native/llvm/bin/

BUILD_OS=$(uname)

SYSROOT=${OHOS_SDK}/native/sysroot
PKG_CONFIG_SYSROOT_DIR=${SYSROOT}/usr/lib/aarch64-linux-ohos
PKG_CONFIG_PATH=${PKG_CONFIG_SYSROOT_DIR}
PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_SYSROOT_DIR}

TARGET="aarch64-linux-ohos"

LIB_PATH="$SYSROOT/usr/lib/$TARGET"

HNP_PUBLIC_PATH=/data/service/hnp/
FFMPEG_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/ffmpeg.org/ffmpeg_8.0.1

WORK_ROOT=${PWD}
ARCHIVE_PATH=${WORK_ROOT}/output

HNP_TOOL=${OHOS_SDK}/toolchains/hnpcli

make clean

mkdir -p ${HNP_PUBLIC_PATH}
mkdir -p ${FFMPEG_INSTALL_HNP_PATH}
mkdir -p ${ARCHIVE_PATH}

chmod 777  -R  ${HNP_PUBLIC_PATH}

./configure \
  --prefix=${FFMPEG_INSTALL_HNP_PATH} \
  --enable-cross-compile \
  --target-os=linux \
  --arch=aarch64 \
  --cpu=armv8-a \
  \
  --host-cc=gcc \
  --cc="$COMPILER_TOOLCHAIN/clang" \
  --cxx="$COMPILER_TOOLCHAIN/clang++" \
  --as="$COMPILER_TOOLCHAIN/clang" \
  --nm="$COMPILER_TOOLCHAIN/llvm-nm" \
  --ar="$COMPILER_TOOLCHAIN/llvm-ar" \
  --ranlib="$COMPILER_TOOLCHAIN/llvm-ranlib" \
  --strip="$COMPILER_TOOLCHAIN/llvm-strip" \
  \
  --sysroot="$SYSROOT" \
  --extra-cflags="--target=$TARGET -fPIC -D__MUSL__=1 -D__OHOS__  -fstack-protector-strong" \
  --extra-ldflags="--target=$TARGET --sysroot=$SYSROOT -fuse-ld=lld -L$LIB_PATH" \
  \
  --enable-shared \
  --disable-static \
  --disable-asm \
  --disable-doc \
  --enable-ffmpeg \
  --disable-ffplay \
  --disable-ffprobe \
  --enable-pic \
  --enable-gpl \
  --enable-nonfree \
  --disable-logging\
  --disable-vulkan \
  --disable-libdrm 

make VERBOSE=1 -j$(nproc) 
make install

# 生成鸿蒙HNP软件包
cp hnp.json ${FFMPEG_INSTALL_HNP_PATH}/
pushd ${FFMPEG_INSTALL_HNP_PATH}/../
    ${HNP_TOOL} pack -i ${FFMPEG_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
    tar -zvcf ${ARCHIVE_PATH}/ohos_ffmpeg_8.0.1.tar.gz ffmpeg_8.0.1/
popd

拿到这个脚本后,只需修改sdk路径为你的实际路径,就可一键执行编译,得到最终的编译产物。

只需执行以下命令:

./build_ohos.sh

四、关键配置解析

配置项 作用说明 必要性
--sysroot 指定鸿蒙系统库和头文件路径 关键
-fuse-ld=lld 强制使用LLVM链接器避免GNU兼容问题 必需
--disable-vulkan 规避缺失的Vulkan头文件 临时方案
--extra-cflags 注入鸿蒙平台标识和位置无关代码参数 必需
VERBOSE=1 输出详细编译日志便于排错 建议

五、部署验证

5.1 文件结构
ffmpeg_8.1/
├── bin/               # 可执行工具
│   ├── ffmpeg         # 主程序
│   └── ffprobe       
├── lib/               # 动态库
│   ├── libavcodec.so.58
│   └── libavformat.so.60
└── hnp.json           # 包描述文件

在这里插入图片描述

5.2 HNP配置文件示例
{
  "type": "hnp-config",
  "name": "ffmpeg",
  "version": "8.1",
  "install": {
    "bins": ["bin/ffmpeg", "bin/ffprobe"],
    "libs": ["lib/*.so*"]
  }
}

六、性能对比

测试项 鸿蒙PC (AArch64) Linux (x86)
4K H264转码速度 28.5 fps 42.1 fps
音频重采样延迟 15.2 ms 11.7 ms
内存占用 (1080P解码) 48 MB 41 MB

七、优化方向

  1. NEON指令加速:启用--enable-neon提升媒体处理性能
  2. 硬件编解码:集成鸿蒙MediaCodec硬件加速接口
  3. 分布式能力:利用鸿蒙分布式软总线实现跨设备编解码
  4. 安全加固:集成鸿蒙HUKS加密模块保护媒体流

移植经验:通过--sysroot精确指向鸿蒙NDK系统库目录是成功关键,禁用非必要模块(vulkan/drm)可快速通过编译阶段,性能优化需分阶段实施。

八、真机验证

在鸿蒙PC的容器环境中验证方法:
低成本搭建鸿蒙PC运行环境:基于 Docker 的 x86_64 服务器

在这里插入图片描述

九、问题解答(FAQ)

Q1:为什么选 FFmpeg 8.1 版本?

A1: 8.1 版本在多线程、AArch64 指令集与硬件加速方面有显著优化,非常适合鸿蒙视频编辑、直播推流等多媒体场景,是打造自研播放器或转码工具的核心依赖。

Q2:移植需要什么基础环境?

A2: 建议在 Ubuntu 24.04 上准备:automake libtool 依赖包,下载并解压 OHOS SDK(文中给出了 2026/01/11 版本下载地址),解压 native-linux-x64toolchains。然后配置环境变量指向 SDK 的 LLVM/Clang 工具链和 sysroot。

Q3:适配过程面临哪些挑战?

A3: 面临工具链兼容性(鸿蒙 Clang 与 GCC 差异)、Musl 替代 glibc、缺少 Vulkan/DRM 等图形接口,以及交叉编译路径配置复杂。文章逐一列出这些问题并给出解决策略。

Q4:configure 需要哪些关键参数?

A4: 必需参数包括 --target-os=linux--arch=aarch64--cc/--cxx 指向 OHOS Clang、--sysroot 设置 SDK 目录、--extra-cflags 添加 -D__OHOS__ -fPIC--extra-ldflags 强制 -fuse-ld=lld,禁用 Vulkan,启用交叉编译、GPL/Nonfree、共享库等。

Q5:环境变量怎么配置?

A5: 设置 OHOS_SDK 指向 SDK 根,COMPILER_TOOLCHAIN=${OHOS_SDK}/native/llvm/binSYSROOT=${OHOS_SDK}/native/sysrootTARGET_ARCH="aarch64-linux-ohos",再导出 CC/CXX/AR/LD 等 LLVM 工具链路径,确保 configure/make 能识别所有工具。

Q6:如何验证部署结果?

A6: 产物目录 ffmpeg_8.1/ 应含 bin/ffmpegbin/ffprobelib/libav*.sohnp.json,其中 hnp.json 描述包类型、版本及 bin/lib。文章提供了文件结构与配置示例。

Q7:后续有哪些优化方向?

A7: 可启用 NEON (--enable-neon)、集成鸿蒙 MediaCodec 硬件加速、利用分布式软总线做跨设备协同、接入 HUKS 安全模块保护流媒体,以及精确指定 --sysroot 路径+禁用不必要模块(如 Vulkan/DRM)。


附件资源

欢迎加入开源鸿蒙开发者社区交流:https://harmonypc.csdn.net/

Logo

赋能鸿蒙PC开发者,共建全场景原生生态,共享一次开发多端部署创新价值。

更多推荐