系統信息CV :: cudacodec :: VideoReader無法發揮RTSP流
- 的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/74.100 55.
- libavcodec的57.103.100/57.103.100
- 了libavformat 57. 77.100/77.100 57.
- 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
這個流中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:[email protected]/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()
直接返回而不檢查,如果條件。
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 }
UPDATE:
我已經解決了這個問題。 solution link
歡迎您訪問解決方案的鏈接,但請確保您的答案在沒有它的情況下很有用:[添加鏈接上下文](// meta.stackexchange.com/a/8259),以便您的同行用戶瞭解什麼它是,爲什麼它在那裏,然後引用您鏈接到的頁面最相關的部分,以防目標頁面不可用。 [僅僅是一個鏈接的答案可能會被刪除。](// stackoverflow.com/help/deleted-answers) – geisterfurz007
@Andre是的,我解決了它。你鏈接的帖子其實是我的,我忘了在這裏更新stackoverflow的解決方案。 – Pawan