2013-03-17 24 views
5

Nach den Beispielen von ffmpeg: decoding_encoding.c und filtering_video.c, verarbeite ich eine vom iPhone aufgenommene Videodatei. Die Videodatei: .mov, Videodimensionen; 480x272, Video Codec: H.264/AVC, 30 Bilder pro Sekunde, Bitrate: 605 kbps.Warum Frame-> Punkte um 20 statt um 1 erhöht?

Ich extrahiere zuerst jeden Rahmen, der YUV ist. Ich wandle YUV in RGB24 um und bearbeite das RGB24, schreibe dann das RGB24 in eine .ppm Datei. Es zeigt an, dass die .ppm-Datei korrekt ist.

Dann plane ich, verarbeitete RGB24-Frames zu einer Videodatei zu kodieren. Da MPEG RGB24 Bildformat nicht unterstützt, habe ich AV_CODEC_ID_HUFFYUV verwendet. Die Ausgabevideodatei (mit 18,5 MB) wird nicht abgespielt. Movie Player auf Ubuntu behauptet einen Fehler: Der Typ des Streams konnte nicht bestimmt werden. Ich habe es auch auf VCL versucht. Es funktioniert einfach nicht, ohne irgendwelche Fehlerinformationen.

Meine zweite Frage ist: Für jeden extrahierte Fram aus der Eingangsvideodatei, erhalte ich seine Punkte als nach filtering_video.c folgt:

frame->pts = av_frame_get_best_effort_timestamp(frame);

ich jedes pts des Rahmens ausdrucken, und dass es finden um 20 erhöht, wie unten:

pFrameRGB_count: 0, frame->pts: 0 
pFrameRGB_count: 1, frame->pts: 20 
pFrameRGB_count: 2, frame->pts: 40 
pFrameRGB_count: 3, frame->pts: 60 

Wo Rahmen der extrahierte Rahmen aus dem Eingangsvideo ist, und pFrameRGB_count ist die Zählwert für verarbeitete Rahmen in RGB24 Form.

Warum liegen sie falsch?

Antwort

5

H.264-Videos verwenden Sie eine 90 kHz clock für die Codierung timestamps. Da Ihr Video 30 fps ist, sollte das PTS-Delta zwischen 2 aufeinanderfolgenden Frames 3000 statt 20 sein.

A-Wert von 20 eine oder beide der folgenden Schritte angibt:

  • Ihre Codierungstakt (dh Abtastrate) konfiguriert ist falsch (bis 600 Hz) für den gegebenen Bildrate von 30 fps

  • Ihre Bilder pro Sekunde sind falsch konfiguriert (bis 4500 fps).

Die allgemeine Formel PTS Delta zu berechnen ist:

PTS delta = (1/fps) * Encoder sampling rate 
0

ich debuggen Codec Kontext der Eingangs-Videodatei zu erhalten, dec_ctx-> time_base.den = 1200; Ich kenne die fps, 30, mit der rechten Maustaste auf die Eingabe-Video-Datei, um seine Eigenschaften zu überprüfen (Ubuntu 12.04) So scheint es die Rahmendauer sollte 1200/30 = 40 Basiseinheiten sein. Aber es ist 20 mit frame-> pts = av_frame_get_best_effort_timestamp (frame);

das Lesepaket des Eingangsvideo hat die Dauer = 20.

Ich fand dec_ctx-> ticks_per_frame = 2. Ich denke, ticks_per_frame 40 macht bis 20. Vielleicht eine innere Formel ist, wie: Rahmendauer in der Basiseinheit = Framedauer x ticks_per_frame (aber es scheint, dass es sich von dem unterscheidet, was im ffmpeg-Dokument gesagt wird, wie time_base gleich 1/frame rate ist.)

0

Ich denke, ich finde die Antwort. Aufgrund fehlender detaillierter Dokumentation von ffmpeg könnten Benutzer in die Irre geführt werden. Ich finde, dass, richtig Punkte zu bekommen, sollte man sich immer wie folgt: video_st-> time_base NICHT video_st-> codec-> time_base

(a) Absolute Zeit eines Rahmens:

Paket-> dts * (1/video_st-> time_base.den)

(b) Absolute Zeit zwischen dem Rahmen und seinem nächsten Rahmen:

Rahmen-> repeat_pict * (1/video_st-> time_base.den)

Verwandte Themen