【问题标题】:cv::cudacodec::VideoReader unable to Play rtsp streamcv::cudacodec::VideoReader 无法播放 rtsp 流
【发布时间】: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 流

Rtsp 流详细信息(来自 vlc)

这个流在 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

【问题讨论】:

    标签: c++ opencv ffmpeg


    【解决方案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。

    【讨论】:

    • 欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.
    • @Andre 是的,我解决了。您链接的帖子实际上是我的,我忘了在stackoverflow上更新解决方案。
    猜你喜欢
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多