Skip to content
Discussion options

You must be logged in to vote

鸿蒙目前没有“导出视频”的现成 API,libpag 各端(Android / iOS / 鸿蒙)都是一样的:SDK 只负责渲染,视频编码需要业务侧接系统能力。

鸿蒙上可行的做法是“逐帧渲染 + 系统编码器”:

  1. PAGSurface.MakeOffscreen(width, height) 创建离屏 surface
  2. PAGPlayer 绑定该 surface,逐帧 setProgress(i / totalFrames) + flush()
  3. surface.readPixels(ColorType::RGBA_8888, AlphaType::Premul, ...) 取当前帧,转成 NV12
  4. OH_VideoEncoder 用 buffer 模式(OH_MD_KEY_PIXEL_FORMAT 设为 AV_PIXEL_FORMAT_NV12)编码 H.264
  5. OH_AVMuxer 封装成 mp4

我们在一台 HarmonyOS 6.1(API 24)真机上把这条链路跑通了,输出 800×800、30fps、150 帧的 mp4,帧数和时长都正确。

几个必须注意的点:

  • H.264 要求宽高为偶数,奇数尺寸要先减一
  • OH_AVMuxer_AddTrack 的 format 必须带 OH_MD_KEY_CODEC_MIME(video/avc),否则返回 AV_ERR_INVALID_VAL
  • 每帧 pts 要自己按帧号算(单位微秒),否则所有帧时间戳相同,mp4 时长会错
  • 新版 HarmonyOS SDK 的 ArkTS 层已移除视频编码接口(media.createVi…

Replies: 2 comments

Comment options

You must be logged in to vote
0 replies
Answer selected by CodeJhF
Comment options

You must be logged in to vote
0 replies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
2 participants