写点什么

鸿蒙开发之视频解码优化以保持后台性能

作者:彭康佳
  • 2024-06-24
    广东
  • 本文字数:1151 字

    阅读完需:约 4 分钟

在 C++中对视频进行解码时,当应用退至后台,解码帧率从 30 帧下降到 10 帧以下是一个常见的问题。为了解决这个问题,我们可以通过优化解码流程和使用硬件加速来提升解码性能,即使在后台也能保持 30 帧的解码性能。

视频解码的基本流程

  1. 创建解码器实例对象

  2. 使用 codecname 或 mimetype 创建解码器。硬解支持 H264 和 H265,软解仅支持 H264。

  3. 设置回调函数

  4. 注册回调函数,包括解码器运行错误、码流信息变化、需要新的输入数据、产生新的输出数据等。

  5. 配置解码器

  6. 配置视频帧宽度、高度和颜色格式。

  7. 设置 Surface 或 Buffer 输出

  8. Surface 模式:使用 OHNativeWindow 传递输出数据。

  9. Buffer 模式:解码数据以共享内存方式输出。

  10. 解码器就绪

  11. 调用 OH_VideoDecoder_Prepare()。

  12. 启动解码器

  13. 调用 OH_VideoDecoder_Start()。

  14. 写入解码码流

  15. 调用 OH_VideoDecoder_PushInputBuffer()。

  16. 处理输出数据

  17. Surface 模式:调用 OH_VideoDecoder_RenderOutputBuffer()显示并释放解码帧。

  18. Buffer 模式:调用 OH_VideoDecoder_FreeOutputBuffer()释放解码帧。

  19. 刷新、重置、停止和销毁解码器

  20. 调用 OH_VideoDecoder_Flush()、OH_VideoDecoder_Reset()、OH_VideoDecoder_Stop()和 OH_VideoDecoder_Destroy()。

代码示例

  • 创建解码器


  OH_AVCodec *videoDec = OH_VideoDecoder_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO_AVC); // 创建H264解码器
复制代码


  • 设置回调函数


  OH_AVCodecCallback cb = {&OnError, &OnStreamChanged, &OnNeedInputBuffer, &OnNewOutputBuffer};  OH_VideoDecoder_RegisterCallback(videoDec, cb, NULL);
复制代码


  • 配置解码器


  constexpr uint32_t DEFAULT_WIDTH = 320;  constexpr uint32_t DEFAULT_HEIGHT = 240;  constexpr OH_AVPixelFormat DEFAULT_PIXELFORMAT = AV_PIXEL_FORMAT_NV12;  OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, DEFAULT_WIDTH);  OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, DEFAULT_HEIGHT);  OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, DEFAULT_PIXELFORMAT);  OH_VideoDecoder_Configure(videoDec, format);
复制代码


  • 启动解码器


  int32_t ret = OH_VideoDecoder_Start(videoDec);
复制代码


  • 写入解码码流


  OH_AVCodecBufferAttr info;  info.size = size;  info.offset = offset;  info.pts = pts;  info.flags = flags;  OH_AVBuffer_SetBufferAttr(buffer, &info);  OH_VideoDecoder_PushInputBuffer(videoDec, index);
复制代码


  • 处理输出数据


  int32_t ret = OH_VideoDecoder_RenderOutputBuffer(videoDec, index); // Surface模式  ret = OH_VideoDecoder_FreeOutputBuffer(videoDec, index); // Buffer模式
复制代码


通过上述步骤和代码示例,我们可以在 C++中优化视频解码,确保即使在应用退至后台后,也能保持 30 帧的解码性能。这些方法通过硬解和优化解码流程,有效提升了解码效率和性能。


参考链接:视频解码

发布于: 刚刚阅读数: 4
用户头像

彭康佳

关注

还未添加个人签名 2018-12-19 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙开发之视频解码优化以保持后台性能_鸿蒙_彭康佳_InfoQ写作社区