视频解码接口

opencv解码

opencv支持YUV/BGR格式输出,为了提高性能,示例中解码输出yuv格式数据。 设置输出yuv格式数据需要对解码的buffer和reference进行设置,方法如下:

  • export OPENCV_FFMPEG_CAPTURE_OPTIONS="extra_frame_buffer_num;8|refcounted_frames;1"

  • extra_frame_buffer_num;8 解码器的frame buffer数量为8,及最多可以保存8帧解码数据。(根据实际业务需要进行调整,默认是5)

  • refcounted_frames;1 设置为1时,需要用户自己管理及时释放Mat对象,每个Mat占一个buffer。Mat对象释放后frame buffer才可以被解码器再次使用。

简单示例如下:​

cv::VideoCapture cap;
 if (!cap.isOpened()) {
  cap.open(input_url);
}
cap.set(cv::CAP_PROP_OUTPUT_YUV, 1.0); //设置输出YUV格式数据
cv::Mat *img = new cv::Mat;
cap.read(*img);
//do something
......
//end
delete img;

/** delete img; 此处是释放img对象后,解码器的frame buffer才可以被解码器利用。
    如果过多Mat对象不被释放,会导致解码器的buffer被占满,引起解码失败。
    cap.set接口函数对输出格式设置, cap::read获取cv::Mat对象img, img数据接下来
    需要通过图像运算加速接口(bmcv模块)对数据进行推理前的预处理操作。**/

ffmpg解码

ffmpeg默认输出NV12格式数据。初始化解码器的buffer配置方法如下:

/* Init the decoders, with reference counting */
av_dict_set(&opts, "refcounted_frames", "1", 0);

/*frame buffer set*/
av_dict_set(&opts, "extra_frame_buffer_num", "20", 0);

/*set tcp*/
av_dict_set(&opts, "rtsp_transport", "tcp", 0);

if ((ret = avcodec_open2(*dec_ctx, dec, &opts)) < 0) {
   fprintf(stderr, "Failed to open %s codec\n",
              av_get_media_type_string(type));
   return ret;
}

Last updated

Was this helpful?