opencv 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 秒后,执行返回错误

原文由 k_kaz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

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

原文由 k_kaz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题