【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID
来源:互联网 发布:用友软件增加固定资产 编辑:程序博客网 时间:2024/05/16 04:50
问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占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解码数据包
其示例伪代码如下图所示
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---DXVA
- 【计算机视觉】【并行计算与CUDA开发】GPU硬编码
- GPU硬解码---CUVID
- 【计算机视觉】【并行计算与CUDA开发】OpenCV中GPU模块使用
- GPU编解码 - 硬解码---CUVID
- GPU编解码 - 硬解码 - CUVID
- 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)
- 【并行计算与CUDA开发】英伟达硬件加速编解码
- 【并行计算-CUDA开发】GPU---并行计算利器
- 【并行计算-CUDA开发】浅谈GPU并行计算新趋势
- 【并行计算-CUDA开发】GPU并行编程方法
- CUDA: GPU的并行计算
- GPU视频解码之CUVID
- 并行编程与计算平台 | NVIDIA CUDA | NVIDIA --- GPU编程
- 【并行计算-CUDA开发】OpenACC与OpenHMPP
- CUDA之大规模GPU并行系列教程(二)——大规模并行计算GPU与CUDA简介
- 【视频开发】【CUDA开发】英伟达CUVID硬解,并通过FFmpeg读取文件
- CSS中visibility,opacity和display:none的区别
- 求最长公共子序列(LCS)
- C语言之结构体
- Google原生下拉刷新控件 SwipeRefreshLayout
- WP论坛WordPress主题免费下载(1)
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID
- hdu 2824 The Euler function (欧拉函数离线模板)
- C语言之myprintf
- Volley 框架 网络请求工具
- OpenCV人脸检测并把图片写成avi视频
- 多线程-Semaphore
- 2016.10.24 C++循环和数组
- Java面向对象三大特性
- leetcode217: Contains Duplicate