鸿蒙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帧、参考帧 |
具体可参考:时域可分层视频编码 |
限制约束
- Buffer模式不支持10bit的图像数据。
- 由于硬件编码器资源有限,每个编码器在使用完毕后都必须调用OH_VideoEncoder_Destroy接口来销毁实例并释放资源。
- 一旦调用Flush,Reset,Stop接口,会触发系统回收OH_AVBuffer,调用者不应对之前回调函数获取到的OH_AVBuffer继续进行操作。
- Buffer模式和Surface模式使用方式一致的接口,所以只提供了Surface模式的示例。
- 在Buffer模式下,调用者通过输入回调函数OH_AVCodecOnNeedInputBuffer获取到OH_AVBuffer的指针对象后,必须通过调用OH_VideoEncoder_PushInputBuffer接口 来通知系统该对象已被使用完毕。这样系统才能够将该对象里面的数据进行编码。如果调用者在调用OH_AVBuffer_GetNativeBuffer接口时获取到OH_NativeBuffer指针对象,并且该对象的生命周期超过了当前的OH_AVBuffer指针对象,那么需要进行一次数据的拷贝操作。在这种情况下,调用者需要自行管理新生成的OH_NativeBuffer对象的生命周期,确保其正确使用和释放。
surface输入与buffer输入
-
两者的数据来源不同。
-
两者的适用场景不同:
- surface输入是指用OHNativeWindow来传递输入数据,可以与其他模块对接,例如相机模块。
- buffer输入是指有一块预先分配好的内存区域,调用者需要将原始数据拷贝进这块内存区域中。更适用于从文件中读取视频数据等场景。
- 在接口调用的过程中,两种方式的接口调用方式基本一致,但存在以下差异点:
- Buffer模式下,调用者通过OH_VideoEncoder_PushInputBuffer接口输入数据;Surface模式下,调用者应在编码器就绪前调用OH_VideoEncoder_GetSurface接口,获取OHNativeWindow用于传递视频数据。
- Buffer模式下,调用者通过OH_AVBuffer中的attr传入结束flag,编码器读取到尾帧后,停止编码;Surface模式下,需要调用OH_VideoEncoder_NotifyEndOfStream接口通知编码器输入流结束。
两种模式的开发步骤详细说明请参考:Surface模式和Buffer模式。
状态机调用关系
如下为状态机调用关系图:
-
有两种方式可以使编码器进入Initialized状态:
- 初始创建编码器实例时,编码器处于Initialized状态。
- 任何状态下调用OH_VideoEncoder_Reset接口,编码器将会移回Initialized状态。
-
Initialized状态下,调用OH_VideoEncoder_Configure接口配置编码器,配置成功后编码器进入Configured状态。
-
Configured状态下调用OH_VideoEncoder_Prepare()进入Prepared状态。
-
Prepared状态调用OH_VideoEncoder_Start接口使编码器进入Executing状态:
- 处于Executing状态时,调用OH_VideoEncoder_Stop接口可以使编码器返回到Prepared状态。
-
在极少数情况下,编码器可能会遇到错误并进入Error状态。编码器的错误传递,可以通过队列操作返回无效值或者抛出异常:
- Error状态下可以调用OH_VideoEncoder_Reset接口将编码器移到Initialized状态;或者调用OH_VideoEncoder_Destroy接口移动到最后的Released状态。
-
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子状态。在此状态下,编码器不再接受新的输入,但是仍然会继续生成输出,直到输出到达尾帧。
-
使用完编码器后,必须调用OH_VideoEncoder_Destroy接口销毁编码器实例。使编码器进入Released状态。
开发指导
详细的API说明请参考API文档。 如下为视频编码调用关系图:
-
虚线表示可选。
-
实线表示必选。