C++ cv::cudacodec::VideoReader无法播放rtsp流
系统信息C++ cv::cudacodec::VideoReader无法播放rtsp流,c++,opencv,ffmpeg,C++,Opencv,Ffmpeg,系统信息 OpenCV=>3.3.0 操作系统/平台=>Ubuntu 16.04,x86_64 编译器=>gcc版本5.4.1 20160904 Cuda=>8.0 Nvidia卡=>GTX 1080 Ti ffmpeg详细信息 libavutil 55。74.100 / 55. 74.100 libavcodec 57.103.100/57.103.100 libav57格式。77.100 / 57. 77.100 libav57设备。7.101 / 57. 7.101 libavfil
- OpenCV=>3.3.0
- 操作系统/平台=>Ubuntu 16.04,x86_64
- 编译器=>gcc版本5.4.1 20160904
- Cuda=>8.0
- Nvidia卡=>GTX 1080 Ti
- ffmpeg详细信息
- libavutil 55。74.100 / 55. 74.100
- libavcodec 57.103.100/57.103.100
- libav57格式。77.100 / 57. 77.100
- libav57设备。7.101 / 57. 7.101
- libavfilter 6.100.100/6.100.100
- libsw4。7.103 / 4. 7.103
- libswresample2。8.100 / 2. 8.100
cudacodec::VideoReader
Rtsp流详细信息(来自vlc)
此流在vlc和cv::VideoCapture
中播放效果很好,但当我尝试在cudacodec::VideoReader
中播放时,我收到一个错误,错误如下所示:
OpenCV错误:在CuvidVideoSource、FILE/home/deep/Development/libraries/OpenCV/OpenCV/modules/cudacodec/src/cuvideou-source.cpp的第66行中,Gpu API调用(CUDA\u-Error\u-FILE\u-NOT\u-FOUND[code=301])
OpenCV错误:在FFmpegVideoSource,file/home/deep/Development/libraries/OpenCV/OpenCV/modules/cudacodec/src/FFMPEG\u video\u source.cpp,第101行,断言失败(init\u MediaStream\u FFMPEG()
复制步骤
#include <iostream>
#include "opencv2/opencv_modules.hpp"
#if defined(HAVE_OPENCV_CUDACODEC)
#include <opencv2/core.hpp>
#include <opencv2/cudacodec.hpp>
#include <opencv2/highgui.hpp>
int main(int argc, const char* argv[])
{
const std::string fname = "rtsp://admin:admin@192.168.1.13/media/video2";
cv::namedWindow("GPU", cv::WINDOW_NORMAL);
cv::cuda::GpuMat d_frame;
cv::Ptr<cv::cudacodec::VideoReader> d_reader = cv::cudacodec::createVideoReader(fname);
for (;;)
{
if (!d_reader->nextFrame(d_frame))
break;
cv::Mat frame;
d_frame.download(frame);
cv::imshow("GPU", frame);
if (cv::waitKey(3) > 0)
break;
}
return 0;
}
#else
int main()
{
std::cout << "OpenCV was built without CUDA Video decoding support\n" << std::endl;
return 0;
}
#endif
更新:
我已经解决了这个问题 在提供的解决方案中,问题与ffmpeg检测到的像素格式有关
为了检查您的rtsp像素格式,您可以使用。
然后在你的图像中,你应该添加与你的像素格式相关的案例,比如
case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUVJ420P:
*chroma_format = ::VideoChromaFormat_YUV420;
break;
然后重建opencv。欢迎链接到解决方案,但请确保没有它时您的答案是有用的:这样您的其他用户就会知道它是什么以及为什么存在,然后引用您链接到的页面的最相关部分,以防目标页面不可用@安德烈:是的,我解决了。你链接的帖子实际上是我的,我忘了更新stackoverflow上的解决方案。
case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUVJ420P:
*chroma_format = ::VideoChromaFormat_YUV420;
break;