【计算机视觉】【并行计算与CUDA开发】GPU硬解码—CUVID

问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈。

解决思路:

利用GPU解码高清视频,降低解码所占用CPU资源,加速解码过程。

一、OpenCV中的硬解码

OpenCV2.4.6中,已实现利用GPU进行读取视频,由cv::gpu::VideoReader_GPU完成,其示例程序如下。

复制代码
 1 int main(int argc, const char* argv[])  2 {  3 if (argc != 2)  4 return -1;  5 const std::string fname(argv[1]);  6 cv::namedWindow("GPU", cv::WINDOW_OPENGL);  7  cv::gpu::setGlDevice();  8  9  cv::gpu::GpuMat d_frame; 10  cv::gpu::VideoReader_GPU d_reader(fname); 11  d_reader.dumpFormat(std::cout); 12 for (;;) 13  { 14 if (!d_reader.read(d_frame)) 15 break; 16 //.... 17 cv::imshow("GPU", d_frame); 18 if (cv::waitKey(3) > 0) 19 break; 20  } 21 return 0; 22 }
复制代码

阅读OpenCV中VideoReader_GPU源码,可发现其底层实现是借助于视频解码库CUVID。

二、视频解码库CUVID

CUVID是基于CUDA的视频解码库,利用CUVID进行解码,主要包括以下四个步骤:

1.解析视频数据文件

2.在GPU端解码

3.转换解码后的数据(YUV420、NV12 —> RGBA)

4.将RGBA数据显示出来

下图为利用CUVID解码的伪代码示意图,其中VideoSource用来解析视频数据文件,VideoParser用来解码数据。

VideoSource的回调函数HandleVideoData(),当VideoSource的状态设置为Started时,开始解析视频文件,并创建VideoParser,解码数据。

VideoParser的回调函数:

HandleVideoSequence() 创建解码器或重设解码器

HandlePictureDecode() 解码每帧视频数据

HandlePictureDisplay() 转换,处理,显示解码后的数据

OpenCV中VideoReader_GPU可以方便地利用GPU读取视频文件,加速解码过程,但OpenCV中VideoReader_GPU无法读取rtsp视频流数据。

这是因为CUVID中CuvideoSource不支持rtsp视频流数据,不能由rtsp地址创建VideoSource

三、CUVID解码rtsp视频流

基本思路:跳过VideoSource模块,利用其他方式解析视频数据文件。

基本步骤:

1.利用FFmpeg解析rtsp视频流

2.创建VideoParser

3.利用FFmpeg读取数据包(AVpacket)

4.将数据包传输到VideoParser(AVpacket —> CUVIDSOURCEDATAPACKET)

5.VideoParser解码数据包

其示例伪代码如下图所示

 

原文链接:https://www.cnblogs.com/huty/p/8517790.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/7615

(0)
上一篇 2022年9月5日 11:04
下一篇 2022年9月5日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml