I want to process and display a network rtsp stream that is created from a raspberry camera. I have this code:
#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;
}
When the stream is not live, the execution of this results in:
[tcp @ 0xa12480] Connection to tcp://192.168.55.151:8554?timeout=0 failed: Connection refused
Which means that the stream tries to connect with tcp. When the stream is live, the execution results in:
[rtsp @ 0xb07960] method SETUP failed: 461 Client error
From internet research i found that the problem may be that the stream uses udp. If i change the URL to:
"udp://192.168.55.151:8554/"
Then the execution freezes in the cv::VideoCapture("udp://192.168.55.151:8554/");
VLC is able to open the rtsp stream. As i am given to understand, ffmpeg is used to decode the stream with opencv. When i run:
ffmpeg -rtsp_transport udp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4
the stream decoding and saving is successful. So how can i specify the lower level protocol to be udp in the opencv code? Is there another way to do it with opencv?
EDIT: If i change the ffmpeg command to use tcp, i.e:
ffmpeg -rtsp_transport tcp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4
then i get the same exact error with the c++ code, 461 client error
EDIT: When the code uses the udp:// link, after some 15 seconds of freeze, the execution returns with error
Setup > Network > RTSP Go to RTSP page. Check RTSP port numbers on camera for dedicated stream. The Default RTSP port number of each camera model can be found in the User Manual. Open VLC player and select “Open Network Stream” from the Media menu.
Answer #1: An IP camera can be accessed in opencv by providing the streaming URL of the camera in the constructor of cv2. VideoCapture . Usually, RTSP or HTTP protocol is used by the camera to stream video.
Real Time Streaming Protocol (RTSP) is an application-level network communication system that transfers real-time data from multimedia to an endpoint device by communicating directly with the server streaming the data.
It was answered in the github opencv issues. The problem is that opencv forces ffmpeg to use a tcp connection, whereas my server uses rtp protocol(udp transport layer). So in order to resolve the problem i changed the server to an http stream.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With