OpenCV - 在版本 3.4 中使用 FFMPEG 通过 RTSP 流式传输 H264

问题描述 投票:0回答:1

我正在尝试将 VIRB 360 相机中的

RTSP
流捕获到
OpenCV
中。该视频是
H264
,根据这里的评论之一,
OpenCV 3.4
应该能够处理它。这是代码:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>

int main()
{
    cv::VideoCapture cap("rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720&liveStreamActive=1", cv::CAP_FFMPEG);

    if(!cap.isOpened())
    {   
        std::cout << "Input error\n";
        return -1;
    }

    cv::namedWindow("Video Feed", cv::WINDOW_AUTOSIZE);

    cv::Mat frame;
    for(;;)
    {
        //std::cout << "Format: " << cap.get(CV_CAP_PROP_FORMAT) << "\n";
        cap >> frame;
        cv::imshow("Video Feed", frame);    
        if (cv::waitKey(10) == 27)
        {
            break;
        }
    }   
    cv::destroyAllWindows();
    return 0;
}

我已经编译了具有

OpenCV
ffmpeg
功能的
gstreamer
。当我运行以下
Gstreamer
命令时,我可以对其进行流式传输,但延迟 3 秒(不可接受):

 gst-launch-1.0 playbin uri=rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720\&liveStreamActive=1

另一方面,我使用

ffplay/ffmpeg
命令得到了 0.5 秒的延迟(可接受):

ffplay -fflags nobuffer -rtsp_transport udp rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720\&liveStreamActive=1

ffplay -probesize 32 -sync ext rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720\&liveStreamActive=1

在上面编写的

OpenCV
代码中,在行中使用
cv::CAP_FFMPEG
标志:

cv::VideoCapture cap("rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720&liveStreamActive=1", cv::CAP_FFMPEG);

给出错误:

[rtsp @ 0x2312040] The profile-level-id field size is invalid (65)
[rtsp @ 0x2312040] method SETUP failed: 461 Unsupported transport
Input error

如果我使用

cv::CAP_GSTREAMER
,它不会抛出任何错误,但什么也不会发生。我认为问题在于
OpenCV
无法处理
UDP
传输层。可能的解决方案有哪些?请提供建议。

编辑1: 我能够通过以下this捕获流。我做了以下更改:代码现在不再是

cv::VideoCapture cap("rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720&liveStreamActive=1", cv::CAP_FFMPEG);
,而是:

#if WIN32
    _putenv_s("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp");
#else
    setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", 1);
#endif
auto cap = cv::VideoCapture("rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720&liveStreamActive=1", cv::CAP_FFMPEG);

#if WIN32
    _putenv_s("OPENCV_FFMPEG_CAPTURE_OPTIONS", "");
#else
    unsetenv("OPENCV_FFMPEG_CAPTURE_OPTIONS");
#endif

但是,它会引发以下错误:

[rtsp @ 0x2090580] The profile-level-id field size is invalid (65)
[rtsp @ 0x2090580] Error parsing AU headers
[h264 @ 0x208d240] error while decoding MB 69 40, bytestream -7
[rtsp @ 0x2090580] Error parsing AU headers
[rtsp @ 0x2090580] Error parsing AU headers
[h264 @ 0x2316700] left block unavailable for requested intra4x4 mode -1
[h264 @ 0x2316700] error while decoding MB 0 16, bytestream 112500
[rtsp @ 0x2090580] Error parsing AU headers

这意味着视频有时会出现问题,看起来像:

我相信这与:

setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", 1);

如有任何建议或改进,我将不胜感激。谢谢你。

opencv ffmpeg video-streaming h.264 rtsp
1个回答
0
投票

设置:

cv::VideoCapture cap;
cap.set(CV_CAP_PROP_BUFFERSIZE, 3); /

我想这已经在这里得到了回答。 OpenCV VideoCapture 由于捕获缓冲区而出现延迟

© www.soinside.com 2019 - 2024. All rights reserved.