Je veux traiter et afficher un flux rtsp réseau qui est créé à partir d'une caméra raspberry. J'ai ce 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;
}
Lorsque le flux n'est pas en direct, l'exécution de ce résultat :
[tcp @ 0xa12480] Connection to tcp://192.168.55.151:8554?timeout=0 failed: Connection refused
Ce qui signifie que le flux tente de se connecter avec tcp. Lorsque le flux est en direct, l'exécution se traduit par :
[rtsp @ 0xb07960] method SETUP failed: 461 Client error
En faisant des recherches sur Internet, j'ai découvert que le problème pouvait venir du fait que le flux utilise udp. Si je change l'URL en :
"udp://192.168.55.151:8554/"
Puis l'exécution se fige dans le cv::VideoCapture("udp://192.168.55.151:8554/");
VLC est capable d'ouvrir le flux rtsp. D'après ce que j'ai compris, ffmpeg est utilisé pour décoder le flux avec opencv. Quand je lance :
ffmpeg -rtsp_transport udp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4
le décodage et la sauvegarde du flux sont réussis. Alors comment puis-je spécifier le protocole de niveau inférieur comme étant udp dans le code opencv ? Y a-t-il un autre moyen de le faire avec opencv ?
EDIT : Si je modifie la commande ffmpeg pour utiliser tcp, c'est-à-dire :
ffmpeg -rtsp_transport tcp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4
ensuite j'obtiens exactement la même erreur avec le code c++, 461 client error
EDIT : Lorsque le code utilise le lien udp://, après quelques 15 secondes de gel, l'exécution revient avec une erreur