opencv rtsp stream protocol

时间:2017-03-27 12:52:00

标签: c++ opencv ffmpeg rtsp

我想处理并显示从覆盆子相机创建的网络rtsp流。 我有这段代码:

#include <iostream>
#include <functional>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main(int argc, char** argv) {

    cv::VideoCapture * stream = new cv::VideoCapture("rtsp://192.168.55.151:8554/");
    if (!stream->isOpened()) return -1;

    cv::namedWindow("rtsp_stream", CV_WINDOW_AUTOSIZE);
    cv::Mat frame;

    while (true) {

        if (!stream->read(frame)) return -1;

        cv::imshow("rtsp_stream", frame);
        cv::waitKey(15);
    }

    return 1;
}

当流不活动时,执行此操作会导致:

[tcp @ 0xa12480] Connection to tcp://192.168.55.151:8554?timeout=0 failed: Connection refused

这意味着流尝试与tcp连接。当流生效时,执行结果为:

 [rtsp @ 0xb07960] method SETUP failed: 461 Client error

从互联网研究中我发现问题可能是流使用udp。如果我将URL更改为:

"udp://192.168.55.151:8554/"

然后执行冻结在cv::VideoCapture("udp://192.168.55.151:8554/");

VLC能够打开rtsp流。据我所知,ffmpeg用于使用opencv解码流。我跑的时候:

ffmpeg -rtsp_transport udp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4

流解码和保存成功。 那么如何在opencv代码中指定较低级别的协议为udp?还有另一种方法可以用opencv吗?

编辑:如果我改变ffmpeg命令使用tcp,即:

ffmpeg -rtsp_transport tcp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4

然后我得到了与c ++代码相同的错误,461客户端错误

编辑:当代码使用udp://链接时,在冻结约15秒后,执行返回错误

3 个答案:

答案 0 :(得分:3)

在github opencv问题中回答了这个问题。 问题是opencv强制ffmpeg使用tcp连接,而我的服务器使用rtp协议(udp传输层)。 因此,为了解决问题,我将服务器更改为http流。

答案 1 :(得分:0)

只需尝试此代码,就可以轻松解决您的问题

for(;;) {
    if(!vcap.read(image)) {
        std::cout << "No frame" << std::endl;
        cv::waitKey();
    }
    cv::imshow("Output Window", image);
    if(cv::waitKey(1) >= 0) break;
}   

答案 2 :(得分:0)

根据此合并请求in opencv repo,您可以通过setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", 1);使OpenCV中的FFMPEG使用UDP协议