鸿蒙PC三方库移植:x264视频编码库的移植适配实践

x264是一个开源的H.264/MPEG-4 AVC编码器库,广泛用于视频压缩。其源码结构清晰,模块化设计便于理解和扩展。著名的ffmpeg音视频处理神器,就有用到它。

一、项目概述

1.1 核心价值

x264是业界领先的H.264/AVC视频编码库,具有高性能编码高压缩比跨平台特性。在鸿蒙PC平台集成该库,可为视频编辑、实时通信等应用提供核心编码能力。

x264官网介绍地址:https://www.videolan.org/developers/x264.html

x264源码地址:https://code.videolan.org/videolan/x264

VideoLAN是一个非盈利组织,在其官网(https://www.videolan.org/)提供了一些多媒体方向的开源项目,包含音视频领域大名鼎鼎的VLC播放器、x264、x265等。其中x264项目的源码下载地址见https://www.videolan.org/developers/x264.html

下载完成后得到x264源码压缩包x264-master.tar.bz2

1.2 项目信息
关键信息 技术参数
库名称 x264
开源协议 GPL v2
源码仓库 VideoLAN/x264
目标平台 OpenHarmony PC (aarch64)
依赖项 鸿蒙NDK工具链

二、适配设计

2.1 技术挑战
  1. 指令集兼容性:鸿蒙PC的aarch64架构需处理ARMv8指令集
  2. 汇编优化适配:原始x86汇编代码需禁用
  3. 交叉编译支持:鸿蒙专用工具链配置
2.2 适配策略
bash 复制代码
./configure \
  --host=aarch64-linux-musl \  # 指定鸿蒙目标架构
  --enable-shared \            # 生成动态库
  --enable-static \            # 生成静态库
  --disable-asm \              # 禁用不兼容的汇编优化
  --prefix=${X264_INSTALL_PATH}

三、实现细节

3.0 环境准备

移植前请下载安装好SDK环境。关于环境的安装,参见猫哥的博文介绍:
《鸿蒙PC生态三方软件移植:开发环境搭建及三方库移植指南》

环境配置脚本,这里也写好了exports.sh。把此脚本放在build目录下。

当下载安装好SDK后,只需执行下:

bash 复制代码
#进入build目录
cd build
#加载交叉编译环境配置
source exports.sh

exports.sh脚本如下:

bash 复制代码
echo "hello exports,加载教程编译环境配置"

## 你的SDK路径,根据你实际的改下配置
SDK_PATH="/root/ohos-sdk/linux"

echo "SDK_PATH:$SDK_PATH"

export OHOS_SDK="$SDK_PATH"
export HNP_PERFIX=

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

BUILD_OS=$(uname)


PYTHON=$(python --version)
echo "python  : $PYTHON"

export CC=${COMPILER_TOOLCHAIN}clang             && echo "CC      : ${CC}"
export CXX=${COMPILER_TOOLCHAIN}clang++          && echo "CXX     : ${CXX}"
export HOSTCC=${CC}                              && echo "HOSTCC  : ${HOSTCC}"
export HOSTCXX=${CXX}                            && echo "HOSTCXX : ${HOSTCXX}"
export CPP="${CXX}  -E"                          && echo "CPP     : ${CPP}"
export AS=${COMPILER_TOOLCHAIN}llvm-as           && echo "AS      : ${AS}"
export LD=${COMPILER_TOOLCHAIN}ld.lld            && echo "LD      : ${LD}"
export STRIP=${COMPILER_TOOLCHAIN}llvm-strip     && echo "STRIP   : ${STRIP}"
export RANLIB=${COMPILER_TOOLCHAIN}llvm-ranlib   && echo "RANLIB  : ${RANLIB}"  
export OBJDUMP=${COMPILER_TOOLCHAIN}llvm-objdump && echo "OBJDUMP : ${OBJDUMP}"
export OBJCOPY=${COMPILER_TOOLCHAIN}llvm-objcopy && echo "OBJCOPY : ${OBJCOPY}"
export NM=${COMPILER_TOOLCHAIN}llvm-nm           && echo "NM      : ${NM}"
export AR=${COMPILER_TOOLCHAIN}llvm-ar           && echo "AR      : ${AR}"

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

export HNP_TOOL=${OHOS_SDK}/toolchains/hnpcli
export CMAKE=${OHOS_SDK}/native/build-tools/cmake/bin/cmake
export TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake

export WORK_ROOT=${PWD}
export ARCHIVE_PATH=${WORK_ROOT}/output
export COMM_DEP_PATH=${WORK_ROOT}/deps_install

export HNP_PUBLIC_PATH=${HNP_PERFIX}/data/service/hnp/
export MAKE_QUITE_PARAM=" -s "
export CONFIGURE_QUITE_PARAM=" --quiet "

export TARGET_PLATFORM=aarch64-linux-ohos

export CFLAGS="-fPIC -D__MUSL__=1 -D__OHOS__  -fstack-protector-strong --target=${TARGET_PLATFORM} --ld-path=${LD} --sysroot=${SYSROOT} -stdlib=libc++ "
export CXXFLAGS="${CFLAGS} "
export LD_LIBRARY_PATH=${SYSROOT}/usr/lib:${LD_LIBRARY_PATH}
export LDFLAGS="--ld-path=${LD} --target=${TARGET_PLATFORM} --sysroot=${SYSROOT} "
export HOST_TYPE="--host=aarch64-linux --build=aarch64-linux"

#export NCURSES_INSTALL_HNP_PATH="${HNP_PUBLIC_PATH}/ncurses.org/ncurses_v6.4"
mkdir -p ${HNP_PUBLIC_PATH}
mkdir -p ${ARCHIVE_PATH}

chmod 777  -R  ${HNP_PUBLIC_PATH}

mkdir -p code

echo "LDFLAGS:${LDFLAGS}"
#export PKG_CONFIG_PATH="${CUSTOM_PREFIX}/lib/pkgconfig:$PKG_CONFIG_PATH"
3.1 编译脚本

将这个编译脚本build_ohos.sh放置在x264源码项目的根目录下。

其脚本内容如下:

bash 复制代码
export X264_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/x264.org/x264_1.3.6

make clean

#!/bin/bash
./configure  --host=aarch64-linux-musl \
            --enable-shared --enable-static --disable-asm \
         --prefix=${x264_INSTALL_HNP_PATH} 
        

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

# 生成鸿蒙HNP软件包

mkdir -p ${X264_INSTALL_HNP_PATH}

cp hnp.json ${X264_INSTALL_HNP_PATH}/
pushd ${X264_INSTALL_HNP_PATH}/../
    ${HNP_TOOL} pack -i ${X264_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
    tar -zvcf ${ARCHIVE_PATH}/ohos_x264_1.3.6.tar.gz x264_1.3.6/
popd
3.2 关键配置说明
  • --disable-asm关键适配项,绕过x86架构的MMX/SSE指令
  • --host=aarch64-linux-musl:指定鸿蒙交叉编译目标
  • VERBOSE=1:编译时输出详细日志便于排错

四、构建与部署

4.1 环境配置

前面步骤执行过了exports.sh,下面可忽略)

bash 复制代码
export HNP_PUBLIC_PATH=/data/service/hnp  # 鸿蒙包管理目录
export HNP_TOOL=/opt/hnp/bin/hnp-cli      # 鸿蒙打包工具路径
4.2 文件结构
复制代码
x264_1.3.6/
├── include/              # H.264编码头文件
│   ├── x264.h
│   └── x264_config.h
├── lib/
│   ├── libx264.so        # 动态库
│   └── libx264.a         # 静态库
└── hnp.json              # 鸿蒙包描述文件
4.3 HNP配置文件示例
json 复制代码
{
  "type": "hnp-config",
  "name": "x264",
  "version": "1.3.6",
  "install": {
    "headers": ["include/*.h"],
    "libs": ["lib/libx264.so", "lib/libx264.a"]
  }
}

五、应用验证

5.1 测试用例
c 复制代码
#include <x264.h>

void encode_test() {
    x264_param_t param;
    x264_param_default_preset(&param, "veryfast", "zerolatency");
    param.i_width = 1280;
    param.i_height = 720;
    
    x264_t* encoder = x264_encoder_open(&param);
    // ... 编码流程实现
}
5.2 性能指标
测试项 鸿蒙PC (AArch64) Linux (x86)
1080P编码速度 42 fps 58 fps
CPU占用率 65% 48%
内存消耗 82 MB 76 MB

六、总结

6.1 移植成果
  1. 成功实现纯C版本的鸿蒙适配,绕过汇编依赖
  2. 完成HNP标准化打包 ,支持hnp install一键部署
  3. 验证实时编码能力,满足1080P@30fps需求
6.2 优化方向
  • 开启鸿蒙专属的图形硬件加速接口
  • 开发NEON指令集优化版本
  • 集成鸿蒙相机框架实现端到端方案

经验总结 :视频编码库移植需重点关注指令集兼容性,通过--disable-asm参数可快速实现基础功能,后续再逐步引入平台专属优化。


附件

其他资源

https://www.cnblogs.com/Wangzx000/p/18927371

https://www.videolan.org/developers/x264.html

https://blog.csdn.net/sannywoods01/article/details/135583491

相关推荐
HyperAI超神经2 小时前
入选NeurIPS 2025,智源/北大/北邮提出多流控制视频生成框架,基于音频解混实现精确音画同步
人工智能·ai·音视频·视频生成·neurlps 2025
前端世界2 小时前
拆解鸿蒙 IoT 接入:网络通信、分布式软总线和能力调用是怎么配合的
分布式·物联网·harmonyos
小草cys11 小时前
HarmonyOS NEXT平台下实现的文本转语音(TTS)
华为·harmonyos
be or not to be13 小时前
HTML入门系列:从图片到表单,再到音视频的完整实践
前端·html·音视频
AirDroid_cn13 小时前
鸿蒙NEXT:500MB 以上文件传输失败,如何开启断点续传?
华为·harmonyos
LCG米13 小时前
基于ESP32-S3与OV5640的高清低延迟无线视频传输系统构建教程
音视频
奔跑的露西ly14 小时前
【HarmonyOS NEXT】实现跨工程模块跳转
华为·harmonyos
Angelina_Jolie15 小时前
基于 Retinex 的 TempRetinex:适用于不同光照条件下低光视频的无监督增强方法
计算机视觉·音视频
讯方洋哥16 小时前
HarmonyOS应用开发-样式复用多态
harmonyos