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

视频解码优化以保持后台性能

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

视频解码的基本流程
  1. 创建解码器实例对象

    • 使用codecname或mimetype创建解码器。硬解支持H264和H265,软解仅支持H264。
  2. 设置回调函数

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

    • 配置视频帧宽度、高度和颜色格式。
  4. 设置Surface或Buffer输出

    • Surface模式:使用OHNativeWindow传递输出数据。
    • Buffer模式:解码数据以共享内存方式输出。
  5. 解码器就绪

    • 调用OH_VideoDecoder_Prepare()。
  6. 启动解码器

    • 调用OH_VideoDecoder_Start()。
  7. 写入解码码流

    • 调用OH_VideoDecoder_PushInputBuffer()。
  8. 处理输出数据

    • Surface模式:调用OH_VideoDecoder_RenderOutputBuffer()显示并释放解码帧。
    • Buffer模式:调用OH_VideoDecoder_FreeOutputBuffer()释放解码帧。
  9. 刷新、重置、停止和销毁解码器

    • 调用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帧的解码性能。这些方法通过硬解和优化解码流程,有效提升了解码效率和性能。

参考链接:视频解码

  • 28
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙开发助手

赏钱一扔,代码超神,事业飞腾

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值