鸿蒙开发进阶(HarmonyOS)视频编码规范

 鸿蒙NEXT开发实战往期必看文章:

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)

HarmonyOS NEXT应用开发案例实践总结合(持续更新......)

HarmonyOS NEXT应用开发性能优化实践总结(持续更新......)


调用者可以调用本模块的Native API接口,完成视频编码,即将未压缩的视频数据压缩成视频码流。

当前支持的编码能力如下:

容器规格 视频编码类型
mp4 HEVC(H.265)、 AVC(H.264)

目前仅支持硬件编码,基于MimeType创建编码器时,支持配置为H264 (OH_AVCODEC_MIMETYPE_VIDEO_AVC) 和 H265 (OH_AVCODEC_MIMETYPE_VIDEO_HEVC)。

每一种编码的能力范围,可以通过能力查询获取。

视频编码支持以下能力:

支持的能力 使用简述
分层编码
设置LTR帧、参考帧
具体可参考:时域可分层视频编码

限制约束

  1. Buffer模式不支持10bit的图像数据。
  2. 由于硬件编码器资源有限,每个编码器在使用完毕后都必须调用OH_VideoEncoder_Destroy接口来销毁实例并释放资源。
  3. 一旦调用Flush,Reset,Stop接口,会触发系统回收OH_AVBuffer,调用者不应对之前回调函数获取到的OH_AVBuffer继续进行操作。
  4. Buffer模式和Surface模式使用方式一致的接口,所以只提供了Surface模式的示例。
  5. 在Buffer模式下,调用者通过输入回调函数OH_AVCodecOnNeedInputBuffer获取到OH_AVBuffer的指针对象后,必须通过调用OH_VideoEncoder_PushInputBuffer接口 来通知系统该对象已被使用完毕。这样系统才能够将该对象里面的数据进行编码。如果调用者在调用OH_AVBuffer_GetNativeBuffer接口时获取到OH_NativeBuffer指针对象,并且该对象的生命周期超过了当前的OH_AVBuffer指针对象,那么需要进行一次数据的拷贝操作。在这种情况下,调用者需要自行管理新生成的OH_NativeBuffer对象的生命周期,确保其正确使用和释放。

surface输入与buffer输入

  1. 两者的数据来源不同。

  2. 两者的适用场景不同:

  • surface输入是指用OHNativeWindow来传递输入数据,可以与其他模块对接,例如相机模块。
  • buffer输入是指有一块预先分配好的内存区域,调用者需要将原始数据拷贝进这块内存区域中。更适用于从文件中读取视频数据等场景。
  1. 在接口调用的过程中,两种方式的接口调用方式基本一致,但存在以下差异点:
  • Buffer模式下,调用者通过OH_VideoEncoder_PushInputBuffer接口输入数据;Surface模式下,调用者应在编码器就绪前调用OH_VideoEncoder_GetSurface接口,获取OHNativeWindow用于传递视频数据。
  • Buffer模式下,调用者通过OH_AVBuffer中的attr传入结束flag,编码器读取到尾帧后,停止编码;Surface模式下,需要调用OH_VideoEncoder_NotifyEndOfStream接口通知编码器输入流结束。

两种模式的开发步骤详细说明请参考:Surface模式Buffer模式

状态机调用关系

如下为状态机调用关系图:

  1. 有两种方式可以使编码器进入Initialized状态:

    • 初始创建编码器实例时,编码器处于Initialized状态。
    • 任何状态下调用OH_VideoEncoder_Reset接口,编码器将会移回Initialized状态。
  2. Initialized状态下,调用OH_VideoEncoder_Configure接口配置编码器,配置成功后编码器进入Configured状态。

  3. Configured状态下调用OH_VideoEncoder_Prepare()进入Prepared状态。

  4. Prepared状态调用OH_VideoEncoder_Start接口使编码器进入Executing状态:

    • 处于Executing状态时,调用OH_VideoEncoder_Stop接口可以使编码器返回到Prepared状态。
  5. 在极少数情况下,编码器可能会遇到错误并进入Error状态。编码器的错误传递,可以通过队列操作返回无效值或者抛出异常:

    • Error状态下可以调用OH_VideoEncoder_Reset接口将编码器移到Initialized状态;或者调用OH_VideoEncoder_Destroy接口移动到最后的Released状态。
  6. Executing 状态具有三个子状态:Flushed、Running和End-of-Stream:

    • 在调用了OH_VideoEncoder_Start接口之后,编码器立即进入Running子状态。
    • 对于处于Executing状态的编码器,可以调用OH_VideoEncoder_Flush接口返回到Flushed子状态。
    • 当待处理数据全部传递给编码器后,可以在input buffers队列中为最后一个入队的input buffer中添加AVCODEC_BUFFER_FLAGS_EOS标记,遇到这个标记时,编码器会转换为End-of-Stream子状态。在此状态下,编码器不再接受新的输入,但是仍然会继续生成输出,直到输出到达尾帧。
  7. 使用完编码器后,必须调用OH_VideoEncoder_Destroy接口销毁编码器实例。使编码器进入Released状态。

开发指导

详细的API说明请参考API文档。 如下为视频编码调用关系图:

  • 虚线表示可选。

  • 实线表示必选。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值