下载
中文
注册

视频解码

功能介绍

通过构造VideoDecoder类实例可实现视频解码功能,解码功能配置项及各项约束与支持情况请参考VideoDecodeConfig数据结构说明。

视频解码支持自定义输出数据格式,通过自定义回调函数传入解码功能配置项,方便用户解码后的数据,详情可参考VideoDecodeCallBack数据结构说明。

接口调用流程

首先根据需求定义需要的输出数据组合方式,根据组合方式参考VideoDecodeCallBack定义回调函数传入解码功能配置项,然后实例化VideoDecoder类,最后调用Decode成员函数完成解码,获取数据。

视频解码接口调用流程参考如下:

图1 视频解码接口调用流程

mxVision提供VideoDecoder类进行视频解码,关键步骤说明如下:

  1. 调用MxInit()接口进行全局初始化。
  2. 定义输出数据组合形式。
    • 输出数据包含视频帧解码后得到的的Image类数据、当前解码帧的“frameId”和通道“channelId”
    • 可根据需要选择获取以上哪些数据。
  3. 定义输出回调函数。
    • 根据要获取的数据定义回调函数,在函数内组装自定义数据。
    • 回调函数输入参数固定为VideoDecodeCallBack形式,函数内可选择输出。
    • 请勿在回调函数内实现过于复杂的操作,建议只进行自定义获取解码数据操作。
  4. 构造视频解码配置项。

    配置项及各项约束与支持情况请参考VideoDecodeConfig数据结构说明。

  5. 实例化视频解码类。

    将配置好的VideoDecodeConfig传入构造函数接口,实例化视频解码类。

  6. 调用解码接口。
    • 一个实例化的解码器在首次调用Decode接口时,会判断是否为预申请场景。
    • 使用预申请场景时,需要在后续调用Decode接口进行预申请输出内存,防止接口调用失败。
  7. 调用MxDeInit()接口对初始化的全局资源进行去初始化。

示例代码

如下提供关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
// 初始化
MxBase::MxInit();
{
    // 定义要接收的解码数据
    struct FrameImage {
        Image image;                 // Video Image Class
        uint32_t frameId = 0;        // Video Frame Index
        uint32_t channelId = 0;      // Video Channel Index
    };

    //定义获取解码数据到自定义结构的回调函数
    APP_ERROR CallBackVdec(Image& decodedImage, uint32_t channelId, uint32_t frameId, void* userData)
    {
      FrameImage* decodedVec = static_cast<FrameImage*>(userData);
      decodedVec->image = decodedImage;
      decodedVec->channelId = channelId;
      decodedVec->frameId = frameId;
    }
    // 构造解码配置项
    VideoDecodeConfig config;
    VideoDecodeCallBack cPtr = CallBackVdec;
    config.width = 1920;
    config.height = 1080;
    config.callbackFunc = cPtr;
    config.skipInterval = 0;
    config.inputVideoFormat = StreamFormat::H264_MAIN_LEVEL;
    config.outputImageFormat = ImageFormat::YUV_SP_420;
    // 实例化解码类
    VideoDecoder videoDecoder(config, deviceId, channelId);
    // 执行解码操作
    ret = videoDecoder.Decode(dataPtr, dataSize, frameId, &decodedFrame); 
}
// 去初始化
MxBase::MxDeInit();