2012-03-28 4 views
4

Ich experimentiere mit Video und würde gerne wissen, wie ich I-Frames aus H264 im MPEG-TS-Container extrahieren kann. Ich möchte Vorschaubilder aus einem Videostream erzeugen. Da der I-Frame ein vollständiges Bild für P- und B-Frames sein soll, gibt es die Möglichkeit, die Daten des Bildes einfach zu extrahieren, ohne es mit einem Codec decodieren zu müssen?Extrahieren von I-Frames von H264 in MPEG-TS in C

Ich habe bereits einige Arbeit mit MPEG-TS-Container-Format, aber ich bin nicht so sehr auf Codecs spezialisiert.

Ich bin eher auf der Suche nach Informationen.

Vielen Dank.

+1

obwohl der I-Frame ist ein ganzes Bild, es ist immer noch codiert .. Decodierung ist eine komplexe Aufgabe. ein Grund, keinen Codec zu verwenden? –

+0

Ich wollte nur versuchen, es selbst zu machen. Gibt es eine Bibliothek, die du vorschlagen würdest? – gekod

+0

Wenn Sie kein echter Profi sind, denken Sie nicht einmal daran, es selbst zu dekodieren (überprüfen Sie den H264-Standard * grins *). 'x264' und' ffmpeg' ist eine Option, obwohl ich keine Ahnung habe, wie man nur I-Frames erzwingt. –

Antwort

3

Ich bin kein Experte in diesem Bereich, aber ich glaube, die Antwort auf Ihre Frage ist NEIN.

Wenn Sie den I-Frame als JPEG-Bild speichern möchten, müssen Sie den Videoframe immer noch "umcodieren", dh Sie müssen zuerst den I-Frame mit einem H264-Decoder dekodieren und dann mit einem JPEG-Encoder kodieren . Dies ist so, weil der JPEG-Encoder einen H264-Frame nicht versteht, er akzeptiert nur unkomprimierte Videoframes als Eingabe.

Da die Eingabe in den JPEG-Encoder ein unkomprimierter Frame ist, können Sie ein JPEG-Bild von jedem Frametyp (I/P/B) erzeugen, wie er bereits decodiert wurde (mit Referenz-I-Frame). wenn nötig) vor dem Einspeisen in den Encoder.

2

Ich bin nicht Experte in diesem Bereich auch. Aber ich habe mit Decodierung gespielt. Verwenden Sie diese gstreamer Pipeline Vorschau von video.mp4 zu extrahieren:

gst-launch -v filesrc location=./video.mp4 ! qtdemux name=demux demux.video_00 ! ffdec_h264 ! videorate ! 'video/x-raw-yuv,framerate=1/1' ! jpegenc ! multifilesink location=image-%05d.jpeg 

Wenn Sie einen Code schreiben möchten, ersetzen Video kommen mit appsrc/appsink Elemente. Das Schreibsteuerprogramm zu den Rohrleitungen (siehe example):

filesrc location=./video.mp4 ! qtdemux name=demux demux.video_00 ! ffdec_h264 ! appsink 
appsrc ! 'video/x-raw-yuv,framerate=1/1' ! jpegenc ! multifilesink location=image-%05d.jpeg 

Buffers ohne GST_BUFFER_FLAG_DELTA_UNIT Flag gesetzt ist I-Frames. Sie können viele Frames sicher überspringen und den Stream bei jedem I-Frame dekodieren.