【发布时间】:2017-10-07 05:35:04
【问题描述】:
系统信息
- OpenCV => 3.3.0
- 操作系统/平台 => Ubuntu 16.04, x86_64
- 编译器 => gcc 版本 5.4.1 20160904
- 库达 => 8.0
- Nvidia 卡 => GTX 1080 Ti
- ffmpeg 详细信息
- libavutil 55. 74.100 / 55. 74.100
- libavcodec 57.103.100 / 57.103.100
- libavformat 57. 77.100 / 57. 77.100
- libavdevice 57. 7.101 / 57. 7.101
- libavfilter 6.100.100 / 6.100.100
- libswscale 4. 7.103 / 4. 7.103
- libswresample 2. 8.100 / 2. 8.100
详细说明
我正在尝试使用cudacodec::VideoReader 播放 rtsp 流
这个流在 vlc 和 cv::VideoCapture 中播放良好,但是当我尝试在 cudacodec::VideoReader 中播放时,我得到一个错误说:
OpenCV Error: Gpu API call (CUDA_ERROR_FILE_NOT_FOUND [Code = 301]) in CuvidVideoSource, file /home/deep/Development/libraries/opencv/opencv/modules/cudacodec/src/cuvid_video_source.cpp, line 66
OpenCV Error: Assertion failed (init_MediaStream_FFMPEG()) in FFmpegVideoSource, file /home/deep/Development/libraries/opencv/opencv/modules/cudacodec/src/ffmpeg_video_source.cpp, line 101
复制步骤
#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
我尝试使用 GDB 调试它,发现在 ffmpeg_video_source.cpp bool init_MediaStream_FFMPEG() 直接返回而不检查 if 条件。
GDB 输出
cv::cudacodec::detail::FFmpegVideoSource::FFmpegVideoSource
(this=0x402a20 <_start>, fname=...) at /home/deep/Development/libraries/opencv/opencv/modules/cudacodec/src/ffmpeg_video_source.cpp:98
98 cv::cudacodec::detail::FFmpegVideoSource::FFmpegVideoSource(const String& fname) :
(gdb) n
99 stream_(0)
(gdb) n
101 CV_Assert( init_MediaStream_FFMPEG() );
(gdb) s
(anonymous namespace)::init_MediaStream_FFMPEG () at /home/deep/Development/libraries/opencv/opencv/modules/cudacodec/src/ffmpeg_video_source.cpp:94
94 return initialized;
(gdb) display initialized
4: initialized = false
(gdb) s
95 }
更新:
我已经解决了这个问题。 solution link
【问题讨论】: