HarmonyOS APP开发---“转码侠“视频处理App,需要用到这个库
HarmonyOS APP开发—"转码侠"视频处理App,需要用到这个库
想做一个视频工具 App,转码、提取音频、加水印、裁剪时长全要?别从头造轮子了——
@ohos/ffmpeg-kit把 FFmpeg 的全部能量搬进了 HarmonyOS,一行命令搞定。
📦 仓库地址:https://gitcode.com/CPF-ApplicationTPC/ohos_ffmpeg_kit | 安装:
ohpm install @ohos/ffmpeg-kit
写在前面
"转码侠"的目标用户是短视频创作者:拍完视频想压缩一下、提取音频做 BGM、加个水印再发——这些需求听起来简单,但底层全都是音视频编解码的硬活。
如果你自己写解码器、编码器、滤镜引擎……那这个 App 估计得开发三年。但 FFmpeg 早就把这些全做好了——转码、剪辑、拼接、滤镜、提取元信息,命令行一条就搞定。
@ohos/ffmpeg-kit 是 FFmpegKit 在 OpenHarmony 上的官方移植,让你在 ArkTS 里直接执行 FFmpeg/FFprobe 命令,异步回调,日志全透明。
这篇文章聊什么
- 视频转码——把 4K 视频压缩成 1080p
- 提取音频——从视频中抽出音轨做 BGM
- 媒体信息探测——用 FFprobe 拿时长、码率、编码格式
第一步:安装
ohpm install @ohos/ffmpeg-kit
依赖会自动装好 libffmpegkit_napi.so(native 库)和 @ohos/aki(JS↔C++ 桥接)。
第二步:FFprobe 探测视频信息
用户选了一个视频,先用 FFprobe 看看基本信息:
import { FFprobeKit, FFmpegKit, ReturnCode } from '@ohos/ffmpeg-kit'
const videoPath = '/data/storage/el2/base/haps/entry/files/input.mp4'
FFprobeKit.getMediaInformation(videoPath).then((session) => {
const info = session.getMediaInformation()
console.info('时长: ' + info.getDuration() + ' ms')
console.info('码率: ' + info.getBitrate())
console.info('格式: ' + info.getFormat())
const streams = info.getStreams()
streams.forEach((stream) => {
if (stream.getType() === 'video') {
console.info(`视频: ${stream.getWidth()}x${stream.getHeight()} ${stream.getCodec()}`)
} else if (stream.getType() === 'audio') {
console.info(`音频: ${stream.getCodec()} ${stream.getSampleRate()}Hz`)
}
})
})
第三步:视频转码压缩
把 4K 视频压成 1080p,码率降到 4Mbps:
const outputPath = '/data/storage/el2/base/haps/entry/files/output_1080p.mp4'
const command = `-i ${videoPath} -vf scale=1920:1080 -c:v libx264 -b:v 4M -c:a aac -b:a 128k ${outputPath}`
const session = FFmpegKit.execute(command)
session.setLogCallback((log) => {
// FFmpeg 的 stderr 日志实时回调,可以做进度条
console.info(`[FFmpeg] ${log.getMessage()}`)
})
session.complete.then((stats) => {
if (ReturnCode.isSuccess(stats.getReturnCode())) {
console.info('转码成功: ' + outputPath)
// 保存到相册或分享
} else {
console.error('转码失败: ' + stats.getFailStackTrace())
}
})
FFmpeg 的命令参数和命令行完全一致——-vf scale=1920:1080 缩放,-b:v 4M 设视频码率,-c:a aac 音频用 AAC。会写 FFmpeg 命令行的人,零学习成本。
第四步:提取音频做 BGM
从视频里抽音轨,存成 MP3:
const audioPath = '/data/storage/el2/base/haps/entry/files/bgm.mp3'
// -vn 去掉视频,只留音频
FFmpegKit.execute(`-i ${videoPath} -vn -c:a libmp3lame -b:a 192k ${audioPath}`)
.getCompleteFuture().then((stats) => {
if (ReturnCode.isSuccess(stats.getReturnCode())) {
console.info('音频提取成功: ' + audioPath)
}
})
第五步:加水印
给视频右下角加一个 logo 水印:
const logoPath = '/data/storage/el2/base/haps/entry/files/logo.png'
const watermarkedPath = '/data/storage/el2/base/haps/entry/files/watermarked.mp4'
// overlay 滤镜:右下角 20px 边距
const cmd = `-i ${videoPath} -i ${logoPath} -filter_complex ` +
`"overlay=W-w-20:H-h-20" -codec:a copy ${watermarkedPath}`
FFmpegKit.executeAsync(cmd, (session) => {
const code = session.getReturnCode()
if (ReturnCode.isSuccess(code)) {
console.info('水印添加成功')
}
})
为什么"转码侠"选了 FFmpegKit?
| 需求 | 自己写编解码 | @ohos/ffmpeg-kit |
|---|---|---|
| 转码 | 写编码器(三年起步) | 一行命令 |
| 剪辑 | 手写 demuxer/muxer | -ss -to 参数 |
| 提取音频 | 写解码器 | -vn 参数 |
| 水印 | 写滤镜引擎 | overlay 滤镜 |
| 格式兼容 | 逐个适配 | FFmpeg 全格式 |
总结
"转码侠"这个场景里,@ohos/ffmpeg-kit 解决了三件事:
- 转码压缩——一行 FFmpeg 命令,4K 压 1080p
- 提取音频——
-vn去视频留音频,MP3 直接出 - 加水印——
overlay滤镜,位置精确到像素
如果你也在做视频编辑、格式转换、音视频处理类 App,@ohos/ffmpeg-kit 就是那座不用自己挖的矿山——FFmpeg 几乎能干任何音视频的活。
更多推荐


所有评论(0)