2014-10-04 8 views
5

Momentan versuche ich, opencv zu verwenden, um ein Video von meiner Canon VB-H710F Kamera zu lesen.H264-Stream von einer IP-Kamera lesen

Zu diesem Zweck habe ich versucht, zwei verschiedene Lösungen:

LÖSUNG 1: Lesen Sie den Strom von RTSP-Adresse

VideoCapture cam ("rtsp://root:[email protected]/stream/profile1=u"); 

while(true) 
    cam >> frame; 

In diesem Fall habe ich opencv bin mit direkt aus einem Stream mit in H264 codiert gelesen (profile1), jedoch ergibt dies das gleiche Problem wie hier gemeldet http://answers.opencv.org/question/34012/ip-camera-h264-error-while-decoding/ Wie in der vorherigen Frage vorgeschlagen, habe ich versucht, FFMPEG Unterstützung in opencv Installation zu deaktivieren, die die h264 Dekodierungsfehler gelöst, aber andere Probleme ausgelöst. Beim Zugriff auf den Stream mit opencv, der von gstreame unterstützt wird, ist immer eine große Verzögerung verbunden. Mit dieser Lösung erreiche ich 15 FPS, aber ich habe eine Verzögerung von 5 Sekunden, was nicht akzeptabel ist, wenn man bedenkt, dass ich eine Echtzeitanwendung brauche.

Lösung 2: Lesen der Rahmen von HTTP-Adresse while (true) { starttime = System.currentTimeMillis();

 URL url = new URL("h t t p://[IP]/-wvhttp-01-/image.cgi"); 
     URLConnection con = url.openConnection(); 
     BufferedImage image = ImageIO.read(con.getInputStream()); 
     showImage(image); 
     estimatedTime=System.currentTimeMillis()-startTime; 
     System.out.println(estimatedTime); 
     Thread.sleep(5); 
} 

Diese Strategie greift einfach den Rahmen von der URL, die die Kamera bereitstellt. Der Code ist in Java, aber die Ergebnisse sind in C++ mit der Curl-Bibliothek identisch. Diese Lösung vermeidet die Verzögerung der ersten Lösung, aber es dauert wenig mehr als 100 ms, um jeden Frame zu erfassen, was bedeutet, dass ich nur durchschnittlich 10 FPS erreichen kann.

Ich würde gerne wissen, wie kann ich das Video mit C++ oder einer anderen in C++ entwickelten Bibliothek lesen?

Antwort

0

Persönlich empfehle ich Ihnen, ffmpeg zu verwenden, um rtsp Streams von IP-Kameras zu lesen, und dann OpenCV verwenden, um aus decodierten Puffer von ffmpeg zu lesen. ffmpeg hat sehr gute Optimierungen in Bezug auf die H.264-Decodierung, Leistung sollte kein kritisches Thema sein.

können Sie ffmpeg verwenden, um zu überprüfen, ob diese korrekt funktionieren kann:

ffmpeg -i "rtsp://root:[email protected]127/stream/profile1=u" -vcodec copy -acodec none test.mp4 

Wenn test.mp4 erfolgreich gespielt werden kann, ist es auf jeden Fall dann ist OK für Sie ffmpeg Libs in Ihr Projekt zu integrieren.

Viel Glück!

+0

Vielen Dank für Ihre Antwort. Obwohl das Video mit 15 fps erfolgreich aufgenommen werden kann, passt diese Lösung nicht zu meinen Zwecken, da die ffmpeg in Ihrem Beispiel das Video einfach in eine Datei kopiert, ohne sie zu entschlüsseln. In meinem Fall muss ich in Echtzeit dekodieren. –

+0

Ja, ich verstehe, dass Sie die Frames extrahieren und die Verarbeitung für jeden Frame durchführen müssen.Das Beispiel ffmpeg testet, ob das Eingangssignal für die Verarbeitung korrekt ist und mit ffmpeg korrekt verarbeitet werden kann. Wie Sie verifiziert haben, können Sie nun mit dem Kompilieren von ffmpeg-Bibliotheken beginnen und ffmpeg lib verwenden, um die Frames manuell mit Codes zu decodieren, und die Frames-Daten stehen Ihnen in der Dekodier-Pipeline zur Verfügung. Diverse ffmpeg Entwicklungshandbücher sind im Internet verfügbar. – JasonYang

+0

Ich habe das schon ausprobiert, aber das Problem bleibt, da ich nur Frames von 2 Sekunden in der Vergangenheit zugreifen kann (ich denke das hängt mit der Puffergröße von ffmpeg zusammen). Können Sie die Größe dieses Puffers verringern, während Sie die Dekodierung in Echtzeit beibehalten? Ich habe bereits im Internet gesucht, konnte aber keine Lösung finden. Danke nochmal –

4

Ich hatte Probleme mit ähnlichen Problemen und denke, ich habe einige Ihrer Probleme mit libVLC mit OpenCV gelöst. FFMPEG schien Probleme zu haben, H264 nicht richtig zu dekodieren, und die neueren Versionen (2.4.11) schienen das TCP-Fix für FFMPEG bereits dort zu haben. Wie auch immer, ich benutze MS Visual Studio unter Windows 7 und 8.1.

Details werden hier angegeben: http://answers.opencv.org/question/65932