首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opencv rtsp流协议

opencv rtsp流协议
EN

Stack Overflow用户
提问于 2017-03-27 20:52:00
回答 3查看 12.7K关注 0票数 6

我想处理和显示一个从树莓摄像机创建的网络rtsp流。我有这样的代码:

代码语言:javascript
复制
#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;
}

当流不是实时的时,执行此操作将导致:

代码语言:javascript
复制
[tcp @ 0xa12480] Connection to tcp://192.168.55.151:8554?timeout=0 failed: Connection refused

这意味着该流尝试与tcp连接。当流处于活动状态时,执行会导致:

代码语言:javascript
复制
 [rtsp @ 0xb07960] method SETUP failed: 461 Client error

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

代码语言:javascript
复制
"udp://192.168.55.151:8554/"

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

VLC能够打开rtsp流。据我所知,ffmpeg是用来解码opencv流的。当我运行时:

代码语言:javascript
复制
ffmpeg -rtsp_transport udp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4

码流解码保存成功。那么,如何在opencv代码中将低级协议指定为udp呢?有没有别的方法可以用opencv做到这一点呢?

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

代码语言:javascript
复制
ffmpeg -rtsp_transport tcp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-29 20:28:06

它在github opencv问题中得到了回答。问题是opencv强制ffmpeg使用tcp连接,而我的服务器使用rtp协议(udp传输层)。所以为了解决这个问题,我把服务器改成了http流。

票数 4
EN

Stack Overflow用户

发布于 2019-07-15 04:42:37

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

票数 1
EN

Stack Overflow用户

发布于 2018-06-06 01:45:17

试一下这段代码,它很容易解决你的问题。

代码语言:javascript
复制
for(;;) {
    if(!vcap.read(image)) {
        std::cout << "No frame" << std::endl;
        cv::waitKey();
    }
    cv::imshow("Output Window", image);
    if(cv::waitKey(1) >= 0) break;
}   
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43047017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档