视频解码优化以保持后台性能
在C++中对视频进行解码时,当应用退至后台,解码帧率从30帧下降到10帧以下是一个常见的问题。为了解决这个问题,我们可以通过优化解码流程和使用硬件加速来提升解码性能,即使在后台也能保持30帧的解码性能。
视频解码的基本流程
-
创建解码器实例对象
- 使用codecname或mimetype创建解码器。硬解支持H264和H265,软解仅支持H264。
-
设置回调函数
- 注册回调函数,包括解码器运行错误、码流信息变化、需要新的输入数据、产生新的输出数据等。
-
配置解码器
- 配置视频帧宽度、高度和颜色格式。
-
设置Surface或Buffer输出
- Surface模式:使用OHNativeWindow传递输出数据。
- Buffer模式:解码数据以共享内存方式输出。
-
解码器就绪
- 调用OH_VideoDecoder_Prepare()。
-
启动解码器
- 调用OH_VideoDecoder_Start()。
-
写入解码码流
- 调用OH_VideoDecoder_PushInputBuffer()。
-
处理输出数据
- Surface模式:调用OH_VideoDecoder_RenderOutputBuffer()显示并释放解码帧。
- Buffer模式:调用OH_VideoDecoder_FreeOutputBuffer()释放解码帧。
-
刷新、重置、停止和销毁解码器
- 调用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帧的解码性能。这些方法通过硬解和优化解码流程,有效提升了解码效率和性能。
参考链接:视频解码