摄像头RTSP流硬解码

1. 问题分析

项目中,之前用的是OpenCV对摄像头的RTSP流进行解码。随着时间的推移以及业务摄像头的增加,发现十路流CPU就已经100%啦,很明显解码所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈,需要赶紧马上上硬解码才行。

查找资料并验证发现:OpenCV中VideoReader_GPU可以方便地利用GPU读取视频文件加速解码过程,但OpenCV中VideoReader_GPU无法读取rtsp视频流数据。CUVID中CuvideoSource不支持rtsp视频流数据,不能由rtsp地址创建VideoSource

硬解码跟计算机显卡有关,赶紧安装cuda_9.0.176_win10 .exe,然后找相关GUP加速相关厂商提供的加速解决方案Demo(C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.0\3_Imaging\cudaDecodeD3D9

摄像头RTSP流硬解码
cudaDecodeD3D9 Demo  CUVID中CuvideoSource不支持rtsp视频流数据,不能由rtsp地址创建VideoSource , 利用其他方式解析RTSP流
摄像头RTSP流硬解码
硬解码基本架构流程

 

2.硬解码rtsp视频流

基本思路:跳过VideoSource模块,利用其他方式(FFmpeg)解析,我结合。

基本步骤:

1.利用FFmpeg解析rtsp视频流。(结合以上Demo就能够把关键部分抽出来,自己封装成DLL工程,方便后面程序使用)

2.创建VideoParser。

3.利用FFmpeg读取数据包(AVpacket)。

4.将数据包传输到VideoParser(AVpacket ---> CUVIDSOURCEDATAPACKET)。

5.VideoParser解码数据包。

6.转换解码后的数据(NV12 ---> RGBA)。

7.将RGBA数据显示出来。

摄像头RTSP流硬解码
VideoSource 读取数据包(AVpacket)并转换成 CUVIDSOURCEDATAPACKET 

 

摄像头RTSP流硬解码

VideoParse 用来解析得到一帧帧的数据。   VideoParser的回调函数:HandleVideoSequence() 创建解码器或重设解码器HandlePictureDecode() 解码每帧视频数据HandlePictureDisplay() 转换,处理,显示解码后的数据。

 

摄像头RTSP流硬解码

VideoDecoder 核心的硬件解码功能类,CUVIDDECODECREATEINFO oVideoDecodeCreateInfo_是创建解码信息结构体,CUvideodecoder oDecoder_是最内核的CUDA硬件解码器,VideoParser的解码功能实际上是在CUvideodecoder解码内核上封装实现的。

 

摄像头RTSP流硬解码
GPU 转换解码后的数据(NV12 ---> RGBA)--加载转换函数

 

摄像头RTSP流硬解码
PU 转换解码后的数据(NV12 ---> RGBA)--调用转换函数  

 

3.测试

CPU降下来了,GPU用起来了。

摄像头RTSP流硬解码
测试发现对H265 H264 都可以成功解码

 

4.参考 

GPU硬解码---CUVID                            https://www.cnblogs.com/dwdxdy/archive/2013/08/07/3244723.html

CUDA和FFMPEG硬件解码视频流       https://blog.****.net/poweroranger/article/details/77845238

ffmpeg NvDecodeD3D9 Demo             http://www.pudn.com/Download/item/id/3275469.html