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)
cudaDecodeD3D9 Demo CUVID中CuvideoSource不支持rtsp视频流数据,不能由rtsp地址创建VideoSource , 利用其他方式解析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数据显示出来。
VideoSource 读取数据包(AVpacket)并转换成 CUVIDSOURCEDATAPACKET
VideoParse 用来解析得到一帧帧的数据。 VideoParser的回调函数:HandleVideoSequence() 创建解码器或重设解码器HandlePictureDecode() 解码每帧视频数据HandlePictureDisplay() 转换,处理,显示解码后的数据。
VideoDecoder 核心的硬件解码功能类,CUVIDDECODECREATEINFO oVideoDecodeCreateInfo_是创建解码信息结构体,CUvideodecoder oDecoder_是最内核的CUDA硬件解码器,VideoParser的解码功能实际上是在CUvideodecoder解码内核上封装实现的。
GPU 转换解码后的数据(NV12 ---> RGBA)--加载转换函数
3.测试
CPU降下来了,GPU用起来了。
测试发现对H265 H264 都可以成功解码