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

解决思路:

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

一、OpenCV中的硬解码

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

  1. int main(int argc, const char* argv[])
  2. {
  3. if (argc != )
  4. return -;
  5. const std::string fname(argv[]);
  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() > )
  19. break;
  20. }
  21. return ;
  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解码数据包

其示例伪代码如下图所示

【GPU编解码】GPU硬解码---CUVID的更多相关文章

  1. 【视频开发】GPU编解码:GPU硬解码---DXVA

    GPU编解码:GPU硬解码---DXVA 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream;IDCT,反 ...

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

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

  3. 【GPU编解码】GPU硬解码---DXVA

    前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...

  4. 【GPU编解码】GPU硬解码---DXVA (转)

    前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...

  5. 【GPU编解码】GPU硬编码

    一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. int main(int argc, ...

  6. 【GPU编解码】GPU硬编码 (转)

    一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. 1 int main(int arg ...

  7. 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---DXVA

    前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...

  8. MediaCodec在Android视频硬解码组件的应用

    https://yq.aliyun.com/articles/632892 云栖社区> 博客列表> 正文 MediaCodec在Android视频硬解码组件的应用   cheenc 201 ...

  9. vlc源码分析(六) 调用OpenMAX硬解码H.265

    H.265(HEVC)编码格式能够在得到相同编码质量视频的前提下,使用相当于H.264(AVC)一半的存储容量,虽然H.265的算法复杂度比H.264高一个数量级,但是硬件水平在不断提高,因此H.26 ...

随机推荐

  1. ci配置smarty手记

    需要用ci来写一个后台配置smarty,在网络上能够找到一些相关的文章.但是都是比较旧的内容,大部分是smary2.*的配置方法.按照这个配置后会出现一些错误.其实配置看smary官方会比较简单. 基 ...

  2. 在线PDF编辑网站http://www.pdfescape.com

    网站地址:http://www.pdfescape.com 先转载一个简单介绍的文章 如果你以前很少阅读PDF文档,电脑中也没有PDF阅读器:adobe reader,foxit reader之类的软 ...

  3. CORS(跨来源资源共享协议) 与 http 302状态

    昨天遇到的问题 使用ajax请求一个支持CORS的跨域页面(A),此页面返回302状态并且重新定向到页面(B).此时ajax停止不前,并且触发 ajax onerror 事件. 正确的相应应该是:aj ...

  4. Fast 迅捷网络 无线路由器FW323的功能设置

    一.问题的提出 1.有一个无线路由器,型号:Fast 迅捷网络 无线路由器FW323 2.有三个网络层级,第一级,用一个路由器A负责对接互联网,内网IP段为192.168.1.*,网关设置192.16 ...

  5. PHP实现简单的监控nginx日志文件功能

    此功能是为了实现,定时监控nginx生成的日志数据,并将新增的数据提交到一个接口(比如大数据的接口,让大数据来进行分析) define("MAX_SHOW", 8192*5); / ...

  6. 【PRML读书笔记-Chapter1-Introduction】1.3 Model Selection

    在训练集上有个好的效果不见得在测试集中效果就好,因为可能存在过拟合(over-fitting)的问题. 如果训练集的数据质量很好,那我们只需对这些有效数据训练处一堆模型,或者对一个模型给定系列的参数值 ...

  7. 利用SVN工具下载OpenCore代码

    OpenCore原来使用的是CVS管理代码的.从09年起,更换用SVN管理代码,大家可以用TortoiseSVN软件下载代码,网址是:http://tortoisesvn.net/,安装后tortoi ...

  8. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  9. uboot命令及内核启动参数

        修改:mw [内存地址] [值] [长度] 例如:mw 0x02000000 0 128 表示修改地址为0x02000000~0x02000000+128的内存值为0. 显示:md [内存地址 ...

  10. SQL Server里的INTERSECT ALL

    在上一篇文章里,我讨论了INTERSECT设置操作的基础,它和INNER JOIN的区别,还有为什么需要好的索引设计支持.今天我想谈下SQL Server里并未实现的INTERSECT ALL操作. ...