2017-10-07 49 views
0

系統信息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

RTSP流的詳細信息(從VLC)的RTSP流的詳細描述

stream_details

這個流中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.cppbool 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

回答

1

在提供的解決方案here的解決方案中,問題與ffmpeg檢測到的像素格式有關。

爲了檢查您的rtsp像素格式,您可以使用ffprobe。 然後你cap_ffmpeg_impl.hpp你應該添加與您的像素格式的情況下像

case AV_PIX_FMT_YUV420P: 
case AV_PIX_FMT_YUVJ420P: 
    *chroma_format = ::VideoChromaFormat_YUV420; 
    break; 

,然後重建OpenCV的內部。

+0

歡迎您訪問解決方案的鏈接,但請確保您的答案在沒有它的情況下很有用:[添加鏈接上下文](// meta.stackexchange.com/a/8259),以便您的同行用戶瞭解什麼它是,爲什麼它在那裏,然後引用您鏈接到的頁面最相關的部分,以防目標頁面不可用。 [僅僅是一個鏈接的答案可能會被刪除。](// stackoverflow.com/help/deleted-answers) – geisterfurz007

+0

@Andre是的,我解決了它。你鏈接的帖子其實是我的,我忘了在這裏更新stackoverflow的解決方案。 – Pawan