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 命令,异步回调,日志全透明。

这篇文章聊什么

  1. 视频转码——把 4K 视频压缩成 1080p
  2. 提取音频——从视频中抽出音轨做 BGM
  3. 媒体信息探测——用 FFprobe 拿时长、码率、编码格式

转码

提取音频

加水印

裁剪

用户选视频

FFprobe 探测信息

用户选操作

FFmpeg: 压缩 1080p

FFmpeg: 抽音轨

FFmpeg: overlay 滤镜

FFmpeg: -ss -to

输出新文件

保存到相册


第一步:安装

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 解决了三件事:

  1. 转码压缩——一行 FFmpeg 命令,4K 压 1080p
  2. 提取音频——-vn 去视频留音频,MP3 直接出
  3. 加水印——overlay 滤镜,位置精确到像素

如果你也在做视频编辑、格式转换、音视频处理类 App,@ohos/ffmpeg-kit 就是那座不用自己挖的矿山——FFmpeg 几乎能干任何音视频的活。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐