6 votes

protocole de flux opencv rtsp

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

3voto

k_kaz Points 397

Il a été répondu dans les questions github opencv. Le problème est que opencv force ffmpeg à utiliser une connexion tcp, alors que mon serveur utilise le protocole rtp (couche transport udp). Donc pour résoudre le problème, j'ai changé le serveur pour un flux http.

0voto

Rashed DIP Points 65

Essayez ce code, il résoudra facilement votre problème.

for(;;) {
    if(!vcap.read(image)) {
        std::cout << "No frame" << std::endl;
        cv::waitKey();
    }
    cv::imshow("Output Window", image);
    if(cv::waitKey(1) >= 0) break;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X