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

解决思路:

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

一、OpenCV中的硬解码

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

[cpp] view plain copy
  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. cv::gpu::GpuMat d_frame;
  9. cv::gpu::VideoReader_GPU d_reader(fname);
  10. d_reader.dumpFormat(std::cout);
  11. for (;;)
  12. {
  13. if (!d_reader.read(d_frame))
  14. break;
  15. //....
  16. cv::imshow("GPU", d_frame);
  17. if (cv::waitKey(3) > 0)
  18. break;
  19. }
  20. return 0;
  21. }

阅读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相关推荐

  1. ffmpeg 采用cuda 硬编解码

    在找资料的过程中,找到两中方法: 第一种是ffmpeg官方文档,连接: http://ffmpeg.org/doxygen/trunk/hw_decode_8c-example.html 第二种是gi ...

  2. 视频GPU硬解码方案对比

    声明:文章仅作知识整理.分享,如有侵权请联系作者删除博文,谢谢! 实时视频处理中,紧靠CPU进行视频解码速度慢/占用CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈.需要进行GPU解码高清 ...

  3. ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战

    注意: VAAPI 是inter gpu 提供的硬编解码接口 VDPAU 是 video decode present api for unix nvdec / ncvid 都是nivida产出的硬解 ...

  4. 哔哩哔哩超大规模视频查重算法与工程优化实践

    本期作者 刘璟 哔哩哔哩高级算法工程师 齐竟雄 哔哩哔哩高级算法工程师 唐哲 哔哩哔哩高级算法工程师 李傲 哔哩哔哩资深算法工程师 一.需求背景 当前站内存在一定比例的UP主投稿重复.低编辑度的低创视 ...

  5. 摄像头RTSP流硬解码

    1. 问题分析 项目中,之前用的是OpenCV对摄像头的RTSP流进行解码.随着时间的推移以及业务摄像头的增加,发现十路流CPU就已经100%啦,很明显解码所占CPU资源较多,导致整个系统处理效率不高 ...

  6. AI视频行为分析系统项目复盘——技术篇2:视频流GPU硬解码

    0 项目背景 见<AI视频行为分析系统项目复盘--技术篇1> https://blog.csdn.net/weixin_42118657/article/details/118105545 ...

  7. “ GPU视频处理技术调研报告 ”

    本文来自英伟达高级工程师 季光在LiveVideoStack 线上交流分享,并由LiveVideoStack整理而成.分享中季光详细解析了GPU在视频编解码,图像分析和视频处理方面的相关技术支持,及实 ...

  8. 使用GPU硬件加速FFmpeg视频转码

    最近看了些视频处理相关的文章,这里有一篇是讲如何使用Nvidia显卡为视频的编解码进行加速的, 为了方便查阅就转载了: 本文内容包括: 在Linux环境下安装FFmpeg 通过命令行实现视频格式识别和 ...

  9. NVIDIA GPU加速FFmpeg

    一.参考资料 使用GPU硬件加速FFmpeg视频转码 二.重要指令 查看支持的硬件加速选项 ffmpeg -hwaccels 查看cuvid提供的GPU编解码器 ffmpeg -codecs | gr ...

最新文章

  1. python os system用法_Python调用系统命令os.system()和os.popen()的实现
  2. mysql中两种备份方法的优缺点_Mysql两种存储引擎的优缺点
  3. 鲁迅先生就ERP实施问题答记者问
  4. python网络编程案例_Python 网络编程_python网络编程基础_python高级编程
  5. VUE—从入门到飞起(五)
  6. [gdb][python][libpython] 使用gdb调试python脚本
  7. Python解析pdf转为TXT格式
  8. selenium的定位方式
  9. 在线十六进制颜色随机生成器
  10. MyBatis 简介
  11. autoflowchart软件使用步骤_【AutoFlowChart流程图自动生成软件】|C语言流程图生成工具(AutoFlowchart)下载_v1.0 中文版_9号软件下载...
  12. 50个app帮你手机大换血!
  13. 基于51单片机的指纹考勤系统
  14. mysql主从 备份数据库脱敏_数据库脱敏有用吗?会不会损坏重要数据?
  15. 通信原理及系统系列11—— 设计无码间串扰的通信系统(升余弦滚降滤波器)
  16. vivado查看原理图
  17. “学习方法”学习笔记(一)费曼技巧
  18. ffmpeg从mp4(音视频)中提取音频aac
  19. 百度地图 前端html,前端js调用百度地图常用基本功能
  20. 基于Python的车辆管理系统

热门文章

  1. tf.ConfigProto()详解
  2. 计算机系统结构广义定义,《计算机系统结构》电子教案(清华版).ppt.ppt
  3. bert中文预训练模型_[中文医疗预训练模型] MC-BERT
  4. 《JAVA与模式》之抽象工厂模式
  5. Java时间日期格式转换
  6. 锻炼后应该做的4件事
  7. 卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
  8. 如何编写YARN应用程序
  9. 程序员面试题精选100题(60)-判断二叉树是不是平衡[数据结构]
  10. 图像处理(十三)保刚性图像变形算法-Siggraph 2004