我想处理和显示从树莓派相机创建的网络rtsp流。我有以下代码:
#include#include #include #include 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秒后,执行将返回错误