GPU视频解码之CUVID
来源:互联网 发布:小米5关闭miui优化 编辑:程序博客网 时间:2024/05/16 09:01
问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈。
解决思路:
利用GPU解码高清视频,降低解码所占用CPU资源,加速解码过程。
一、OpenCV中的硬解码
OpenCV2.4.6中,已实现利用GPU进行读取视频,由cv::gpu::VideoReader_GPU完成,其示例程序如下。
int main(int argc, const char* argv[]) { if (argc != 2) return -1; const std::string fname(argv[1]); cv::namedWindow("GPU", cv::WINDOW_OPENGL); cv::gpu::setGlDevice(); cv::gpu::GpuMat d_frame; cv::gpu::VideoReader_GPU d_reader(fname); d_reader.dumpFormat(std::cout); for (;;) { if (!d_reader.read(d_frame)) break; //.... cv::imshow("GPU", d_frame); if (cv::waitKey(3) > 0) break; } return 0; }阅读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解码数据包
其示例伪代码如下图所示
http://www.cnblogs.com/dwdxdy/p/3244723.html- GPU视频解码之CUVID
- GPU硬解码---CUVID
- GPU编解码 - 硬解码---CUVID
- GPU编解码 - 硬解码 - CUVID
- 视频解码库CUVID流程
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID
- 【视频开发】GPU编解码:GPU硬解码---DXVA
- stage video 【利用Gpu解码视频】
- OpenCV利用GPU解码高清视频
- 使用GPU进行视频编解码
- FFMPEG 之视频解码
- GPU视频编解码及性能质量测试基础
- 视频编解码之基本原理
- NDK之FFmpeg视频解码
- MPEG音视频编解码之MP3编解码概述
- MPEG音视频编解码之MP3编解码概述
- 视频编解码学习之二:编解码框架
- 视频编解码学习之二:编解码框架
- SSL JudgeOnline 1456——骑士旅行
- idea getset的快捷键
- 三个理由告诉你 为什么社保不能断缴
- Ajax UpdateProgress 显示时间短(超时)
- coordinatorLayout使用详解及注意事项
- GPU视频解码之CUVID
- 使用IDEA+GRADLE创建springboot项目
- dataTables-使用详细说明整理
- Servlet之cookie和session简介及其作用
- Android应用程序进行系统签名
- spring boot 自动化配置原理和配置查看
- (实用篇)php中计算中文字符串长度、截取中文字符串的函数代码
- 大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合
- servlet 学习心得