写这篇文章是应为之前的网上很多文章分析:
cuvidCreateVideoSource( )这个函数不支持一些视频流:rtsp类型过来的视频信号。
在NVIDIA的Decode实例中使用的是本地的视频文件:1080.246,720.mp4等视频文件。创建视频源用的是本地文件。
调试开发环境:
1,Jetson TX1 上安装live555作为视频服务器。
2,台式机带有GT1050 ti的显卡。ubunut 16.04。点播视频流H264格式。
开始调试尝试了ffmpeg + cuvid的方案(ffmpeg代码没时间仔细研究),没有成功。后来找了几篇文章在网上可以使用opencv中的使用。opencv可以直接通过VideoCapture这个类来完成rtsp数据协议解析:
cv::Ptr<cv::cudacodec::VideoReader> d_reader = cv::cudacodec::createVideoReader(fname);
随后跟踪代码:
Ptr<VideoReader> cv::cudacodec::createVideoReader(const String& filename)
{
CV_Assert( !filename.empty() );
Ptr<VideoSource> videoSource;
try {
videoSource.reset(new CuvidVideoSource(filename));
} catch (...)
{
Ptr<RawVideoSource> source(new FFmpegVideoSource(filename));
videoSource.reset(new RawVideoSourceWrapper(source));
}
return makePtr<VideoReaderImpl>(videoSource);
}
这个函数在cudacodec::命名空间下,调用了两个函数,一个是try语句,还有一个catch。CuvidVideoSource不成功,然后捕捉执行FFmpegVideoSource。
看下CuvidVideoSource函数,最后执行:CUresult cuRes = cuvidCreateVideoSource(&videoSource_, fname.c_str(), ¶ms);
这个cuvidCreateVideoSource函数在NIVIDA的cuda安装包中的一个动态库,没有给源码,给了文档和demo。这里没有看明白可以仔细看一下传入的参数,字符串描述了不同的视频源。可以是本地文件比如:/media/test/1080.264文件,也可以是rtsp://xxx.xxx.xxx.xxx/test/1080.264。这样分析下来这个cuda安装包中的函数实现了简单的rtsp协议,并且可以解析网络视频流。
不用使用额外任何第三方库,只用opencv就可以做解码数据流的功能。最后不得不感叹一下opencv确实一款不折不扣的好软件,关键还是开源的。通过nivida-smi查看GPU在编解码时候使用资源的情况。
贴上demo效果,可以通过nivida-smi查看GPU消耗的资源。