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?
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. –
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
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 –