2017-10-07 3 views
0

Informations sur le systèmecv :: cudacodec :: VideoReader incapable de lire le flux RTSP

  • OpenCV => 3.3.0
  • Système d'exploitation/Plate-forme => Ubuntu 16.04, x86_64
  • compilateur => gcc version 5.4.1 20160904
  • Cuda => 8,0
  • carte Nvidia => GTX 1080 Ti
  • détails 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

Description détaillée

je suis en train de lire un flux RTSP utilisant cudacodec::VideoReader

Rtsp Détails flux (de vlc)

stream_details

ce flux joue bien dans vlc et cv::VideoCapture mais quand j'essaie de jouer dans cudacodec::VideoReader je reçois une erreur dire:

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

Étapes pour reproduire

#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 

J'ai essayé de débogage à l'aide de GDB et a vu que, dans ffmpeg_video_source.cppbool init_MediaStream_FFMPEG() retourne directement sans vérifier si la condition.

sortie 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   } 

MISE À JOUR:

J'ai résolu le problème. solution link

Répondre

1

Dans la solution fournie here le problème était lié au format de pixel détecté par ffmpeg.

Afin de vérifier votre format de pixel rtsp, vous pouvez utiliser ffprobe.Puis l'intérieur de votre cap_ffmpeg_impl.hpp vous devez ajouter le cas lié à votre format de pixel comme

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

Et puis reconstruire OpenCV.

+0

Un lien vers une solution est le bienvenu, mais s'il vous plaît assurez-vous que votre réponse est utile sans cela: [ajouter un contexte autour du lien] (// meta.stackexchange.com/a/8259) pour que vos autres utilisateurs aient une idée de ce que c'est et pourquoi c'est là, puis citez la partie la plus pertinente de la page que vous liez au cas où la page cible n'est pas disponible. [Réponses qui sont un peu plus d'un lien peut être supprimé.] (// stackoverflow.com/help/deleted-answers) – geisterfurz007

+0

@Andre oui je l'ai résolu. Le post que vous avez lié est en fait le mien, j'ai oublié de mettre à jour la solution ici sur stackoverflow. – Pawan