zoukankan      html  css  js  c++  java
  • 【计算机视觉】【并行计算与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解码数据包

    其示例伪代码如下图所示

     

  • 相关阅读:
    Windows10 安装 MySQL 并开启远程访问
    Navicat Premium 12 破解教程
    基于 debian9 安装 Windows10 双系统 丢失引导文件的修复办法
    SD从零开始59-61,跨公司的库存转移,Interface 修改,可用性检查和需求传递
    SD从零开始57-58,第三方订单处理,跨公司销售
    SD从零开始55-56, 风险管理, 付款卡
    SD从零开始51-54 信用控制范围, 信用范围数据维护, 自动信用控制, 信用控制-阻止后续功能
    SD从零开始47-50, 装运成本基础、控制、结算, 信用/风险管理概述
    SD从零开始45-46
    SD从零开始41-44
  • 原文地址:https://www.cnblogs.com/huty/p/8517791.html
Copyright © 2011-2022 走看看