【鸿蒙优选三方库】@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 让它生成命令,再粘进来------这也是一种生产力。

相关推荐
WHMONY7 小时前
大一独立开发鸿蒙原生 AI Agent:聊聊我为什么死磕端侧模型与“技术平权”
harmonyos
todoitbo8 小时前
把 K-Lite「什么都能播」搬上鸿蒙 PC:影匣播放器的 FFmpeg + libass 原生移植实录
华为·ffmpeg·harmonyos·鸿蒙
威哥爱编程10 小时前
模拟面试智能体开发实战 05:给面试官接上题库和检索,题目结构化、大纲可溯源,AI 不再凭印象出题
python·agent·harmonyos
威哥爱编程10 小时前
模拟面试智能体开发实战 06:答得好怎么追问、答得错怎么点破,追问引擎让面试官会深挖会纠错
python·agent·harmonyos
c2892480843s11 小时前
【鸿蒙心迹】深色模式适配实战:资源限定词、动态取色与一张图两个主题
移动开发·harmonyos·鸿蒙·arkui·深色模式
贾伟康11 小时前
HarmonyOS API 26 Navigation 连续栈操作:中间过程合并、最终状态与强制新实例
harmonyos·arkts·navigation·navpathstack·路由治理
FlightYe1 天前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
贾伟康1 天前
HarmonyOS API 26 Navigation 跨包路由:router_map、HSP 按需加载与失败回落
harmonyos·arkts·模块化·navigation·hsp
KevinChaos1 天前
阳台小花园开发手记 04|HarmonyOS 7.0 互动卡片:倾斜手机时的卡片效果
华为·harmonyos
威哥爱编程1 天前
模拟面试智能体开发实战 04:面试聊到哪算哪?用状态机把整场面试编排起来
python·agent·harmonyos