【鸿蒙优选三方库】@ohos/ffmpeg-kit:把 FFmpeg 的全部能量带进鸿蒙

【鸿蒙优选三方库】@ohos/ffmpeg-kit:把 FFmpeg 的全部能量带进鸿蒙

FFmpeg 是音视频领域的瑞士军刀,但要在鸿蒙里用它,得自己编译源码、写 NAPI 桥接、处理异步回调。@ohos/ffmpeg-kit 把这些活全干了------在 ArkTS 里直接执行 FFmpeg 命令,会写命令行的人零学习成本。
📦 仓库地址 | ohpm install @ohos/ffmpeg-kit | v1.0.1 | MIT


它解决什么问题

音视频处理的复杂度是出了名的:转码要懂编码器和容器、剪辑要处理时间戳对齐、加水印要实现滤镜引擎。自己写?按人月算。

FFmpeg 早就把这些全做好了,一条命令搞定。@ohos/ffmpeg-kit 是 FFmpegKit 跨平台项目在 OpenHarmony 上的移植,底层依赖 @ohos/aki 做 JS↔C++ 桥接,native 库 libffmpegkit_napi.so 一并交付,免编译即可用。

📌 上游 FFmpegKit 已于 2025 年停止维护(6.0 版本二进制 2025-04-01 下线)。本仓库是 OpenHarmony 社区的延续维护。


核心能力

能力 说明
FFmpeg 命令 转码、剪辑、拼接、滤镜、混音
FFprobe 探测 时长、码率、编码、分辨率
异步执行 后台跑,Promise + 回调通知
日志回调 FFmpeg 全部 stderr/stdout 实时上来
会话管理 每个命令一个 Session,可取消可查状态
多端复用 仓库同时维护 OHOS / Flutter / RN 桥接

30 秒上手

bash 复制代码
ohpm install @ohos/ffmpeg-kit

视频转音频:

typescript 复制代码
import { FFmpegKit, ReturnCode } from '@ohos/ffmpeg-kit'

const session = FFmpegKit.execute(
  '-i /data/storage/el2/base/files/input.mp4 -vn -acodec copy /data/storage/el2/base/files/output.aac'
)

session.setLogCallback((log) => console.info(`[FFmpeg] ${log.getMessage()}`))

// ⚠️ 必须等 complete 之后再查输出数据
const stats = await session.getCompleteFuture()
if (ReturnCode.isSuccess(stats.getReturnCode())) {
  console.info('成功,输出: ' + session.getOutput())
} else if (ReturnCode.isCancel(stats.getReturnCode())) {
  console.info('已取消')
} else {
  console.error('失败: ' + stats.getFailStackTrace())
}

探测媒体信息:

typescript 复制代码
import { FFprobeKit } from '@ohos/ffmpeg-kit'

const session = await FFprobeKit.getMediaInformation(videoPath)
const info = session.getMediaInformation()

console.info(`时长 ${info.getDuration()}ms / 码率 ${info.getBitrate()} / 格式 ${info.getFormat()}`)
info.getStreams().forEach((s) => {
  if (s.getType() === 'video') console.info(`视频 ${s.getWidth()}x${s.getHeight()} ${s.getCodec()}`)
  if (s.getType() === 'audio') console.info(`音频 ${s.getCodec()} ${s.getSampleRate()}Hz`)
})

取消执行:

typescript 复制代码
const sessionId = session.getSessionId()
FFmpegKit.cancel(sessionId)   // 取消指定会话
FFmpegKit.cancel()            // 取消全部

社区已解决的典型问题

会话完成后查不到输出数据 (#30)

命令执行完成后通过 Session 查询输出拿不到结果。已修复查询逻辑。关键是要在 getCompleteFuture() resolve 之后再查,执行中查是空的。

FFprobe 没有信息输出 (#28 / #29)

调用 FFprobe 后 Session 里没有信息。已修复。取数据有两种方式:getMediaInformation() 拿结构化对象(推荐,类型安全),getOutput() 拿原始文本(适合排查问题)。

Demo 依赖引入导致编译失败 (#27)

改为本地 HAR 包维护,Demo 正常编译运行。如果你的工程遇到依赖解析问题,可以参考这个方式------把编译好的 HAR 放进工程直接依赖,绕过 ohpm 网络解析。

Flutter 侧质量加固 (#26)

仓库同时维护 OHOS / Flutter / RN 三个平台的桥接,多端质量同步提升。


适合谁用

  • 视频工具类 App:转码、剪辑、拼接、加水印
  • 音频处理:提取音轨、格式转换、铃声制作
  • 直播推拉流:拉 RTMP/HLS 流并处理
  • 媒体信息解析:用 FFprobe 拿元数据
  • Flutter / RN 应用:仓库同源支持

一个必须知道的点

FFmpeg 是 CPU 密集型任务。批量处理时要串行,不要并行------并行跑多个会让每个都变慢,还可能触发内存压力:

typescript 复制代码
for (const cfg of configs) {
  await processOne(cfg)                              // 串行
  await new Promise((r) => setTimeout(r, 200))       // 批间喘息
}

会写 FFmpeg 命令行的人,装上就能用。不会写的,把需求描述给 AI 让它生成命令,再粘进来------这也是一种生产力。

相关推荐
是jin奥1 小时前
最新 FFmpeg 安装脚本:Linux x86_64
linux·运维·ffmpeg
骑着蜗牛撵大象3272 小时前
用 Codex 批量做数字人商品口播视频:从分镜 JSON 到成片校验的流水线
java·ffmpeg·json·音视频·数字人·视频·codex
贾伟康3 小时前
【健康菜谱助手|03】HarmonyOS ArkTS 冰箱食材推荐实战:从本地食材选择生成可解释的候选菜谱
软件测试·移动开发·harmonyos·arkts·arkui·1024程序员节
翰德恩咨询4 小时前
IPD咨询洞察:华为项目经理的任职资格与激励模型
华为
企业数字化笔记4 小时前
视频加放大特写后音画不同步怎么办?OpenCV转场与FFmpeg音轨续接实战
opencv·ffmpeg·音视频
万物智能信息科技5 小时前
LoRa串口透传驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·嵌入式硬件·华为·开源·harmonyos
贾伟康14 小时前
【化学实验室|17】HarmonyOS ArkTS 亮暗色与视觉令牌实战:集中颜色、间距和交互状态避免页面割裂
前端·移动开发·harmonyos·arkts·arkui
贾伟康18 小时前
【化学实验室|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致
安全·移动开发·harmonyos·arkts·arkui
贾伟康19 小时前
【化学实验室|20】HarmonyOS ArkTS AppGallery 发布复查实战:核对包名、版本、设备、素材和离线声明
软件测试·移动开发·harmonyos·arkts·arkui