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

337 阅读2分钟

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

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

参考链接:视频解码