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)
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数据显示出来。
3.测试
CPU降下来了,GPU用起来了。
4.参考
GPU硬解码---CUVID https://www.cnblogs.com/dwdxdy/archive/2013/08/07/3244723.html
CUDA和FFMPEG硬件解码视频流 https://blog.csdn.net/poweroranger/article/details/77845238
ffmpeg NvDecodeD3D9 Demo http://www.pudn.com/Download/item/id/3275469.html