我想处理和显示一个从树莓摄像机创建的网络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秒的冻结之后,执行返回错误
发布于 2017-03-29 20:28:06
它在github opencv问题中得到了回答。问题是opencv强制ffmpeg使用tcp连接,而我的服务器使用rtp协议(udp传输层)。所以为了解决这个问题,我把服务器改成了http流。
发布于 2019-07-15 04:42:37
根据合并后的请求in opencv repo,可以通过setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", 1);使OpenCV中的FFMPEG使用UDP协议
发布于 2018-06-06 01:45:17
试一下这段代码,它很容易解决你的问题。
for(;;) {
if(!vcap.read(image)) {
std::cout << "No frame" << std::endl;
cv::waitKey();
}
cv::imshow("Output Window", image);
if(cv::waitKey(1) >= 0) break;
} https://stackoverflow.com/questions/43047017
复制相似问题