Prozess-video-stream aus dem Speicher-Puffer
Brauche ich, um zu analysieren, einen video-stream (mpeg-ts) von proprietären Netzwerkprotokoll (die ich bereits weiß, wie zu tun) und dann würde ich gerne verwenden OpenCV, um Prozess der video-Streams in frames. Ich weiß, wie Sie cv::Videoergreifung aus einer Datei oder aus einer standard-URL, aber ich würde gerne setup, OpenCV, um aus einem Puffer gelesen(s) in Erinnerung, wo ich kann, speichern Sie die video-stream-Daten, bis Sie gebraucht wird. Gibt es eine Möglichkeit, das einrichten eines call-back-Methode (oder jede andere interfrace), so dass ich auch noch der cv::Videoergreifung Objekt? Gibt es eine bessere Art und Weise zu erreichen, die Verarbeitung des video mit dem schreiben in eine Datei und dann neu Lesen. Ich würde auch unterhalten mit FFMPEG direkt wenn, dass ist die bessere Wahl. Ich denke, ich kann konvertieren AVFrames zur Matte, wenn nötig.
- Wie Lesen Sie und decodieren der Puffer? Ich habe einmal integriert OpenCV mit proprietären Datenstrom durch die Initialisierung ein IplImage-Objekt, allokierung von Speicher und kopieren Sie den frame aus dem stream zu IplImage mit memcpy. In meinem Fall war ich Glück haben, einen richtigen raw-Bild aus dem stream.
- der video-stream einen normalen mpeg ts stream, sobald ich extrahiert haben, Sie aus der proprietären Kapselung. Danach will ich zur Verwendung der vorhandenen tools (OpenCV vorzugsweise) zum decodieren der transport stream und video-frames.
- Hier ist ein Beispiel, wie-die Aufnahme eines video-stream mit OpenCV, Kodieren Sie in einem Puffer, wie mpeg-4 und dann deocde aus dem Puffer: dimitri-christodoulou.blogspot.com/2012/02/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich ein ähnliches Bedürfnis vor kurzem. Ich war auf der Suche nach einem Weg in OpenCV, um ein video abzuspielen, das war schon im Speicher, aber ohne jemals zu schreiben, die video-Datei auf der Festplatte. Ich fand heraus, dass die ffmpeg-Schnittstelle bereits unterstützt dies durch
av_open_input_stream
. Es ist nur ein wenig mehr Vorbereitungsarbeit erforderlich, im Vergleich zu denav_open_input_file
- Aufruf in OpenCV, um eine Datei zu öffnen.Zwischen den folgenden zwei websites, die ich war in der Lage um Stück zusammen eine funktionierende Lösung mit der ffmpeg aufruft. Bitte beachten Sie die Informationen auf diesen websites für weitere Informationen:
http://ffmpeg.arrozcru.org/forum/viewtopic.php?f=8&t=1170
http://cdry.wordpress.com/2009/09/09/using-custom-io-callbacks-with-ffmpeg/
Um es arbeiten in OpenCV, ich landete hinzufügen einer neuen Funktion zu den
CvCapture_FFMPEG
Klasse:Ich den Zugriff, um es durch eine neue API-Aufruf in die highgui DLL, ähnlich
cvCreateFileCapture
. Die neueopenBuffer
Funktion ist im Grunde das gleiche wie dieopen( const char* _filename )
- Funktion mit dem folgenden Unterschied:wird ersetzt durch:
Stellen Sie außerdem sicher, dass call
av_close_input_stream
imCvCapture_FFMPEG::close()
Funktion stattav_close_input_file
in dieser situation.Nun die
read_buffer
callback-Funktion übergeben wird, inav_alloc_put_byte
ich definiert als:Dieser Lösung übernimmt das gesamte video enthalten ist, in einem Speicher-Puffer und hätte wahrscheinlich optimiert werden, um die Arbeit mit den streaming-Daten.
So, dass ist es! Btw, ich bin mit der OpenCV-version 2.1, so YMMV.
memcpy(probe_data.buf, data, 4096)
verwenden sollten probe_data.buf_size nicht 4096 (oder es stürzt bei Eingaben kleiner als 4096).av_alloc_put_byte
umbenannt wurde, umavio_alloc_context