Kann das ffmpeg-av-libs Rückkehr eine genaue PTS?
Arbeite ich mit einem mpeg-stream, die verwendet eine IBBP... GOP-Sequenz. Die (DTS,PTS)
zurückgegebenen Werte für die ersten 4 AVPackets sind wie folgt: I=(0,3) B=(1,1) B=(2,2) P=(3,6)
Die Punkte auf den I-frame, wie es aussieht, ist legit, aber dann die Punkte auf den B-frames nicht richtig sein kann, da die B-frames sollte nicht angezeigt werden vor dem I-frame, als Ihre PTS-Werte zeigen. Ich habe auch versucht die Dekodierung der Pakete und über die pts-Wert in der resultierenden AVFrame, setzen, dass die Punkte immer auf null gesetzt.
Gibt es eine Möglichkeit, um eine genaue Punkte von ffmpeg? Wenn nicht, was ist die beste Möglichkeit zum synchronisieren von audio dann?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denke ich, dass ich endlich herausgefunden, was Los ist, basierend auf einem Kommentar in http://www.dranger.com/ffmpeg/tutorial05.html:
Übersetzung: Wenn ich feed ein Paket in avcodec_decode_video (ist), dass eine PTS 12, avcodec_decode_video() wird nicht zurückkehren die dekodierten frame enthalten in diesem Paket, bis ich das füttern ein später Paket, das ein DTS-12. Wenn das Paket PTS ist das gleiche wie seine DTS, dann wird das Paket gegeben ist die gleiche wie der Rahmen zurückgegeben. Wenn das Paket PTS 2 frames später als seine DTS, dann avcodec_decode_video() verzögert den Rahmen und nicht zurück, bis ich 2 weitere Pakete.
Basierend auf diesem Verhalten, ich vermute, dass av_read_frame() ist vielleicht Neuanordnen der Pakete von IPBB zu IBBP, so dass avcodec_decode_video() hat nur den Puffer der P-frames 3 frames statt 5. Für Beispiel, der Unterschied zwischen der Eingabe und der Ausgabe der P-Frames mit dieser Bestellung ist 3 (6 - 3):
vs. ein Unterschied von 5 mit dem standard-Bestellung (6 - 1):
<shrug/> das ist aber eine Reine Vermutung.
Ok, die Kratzer meiner vorherigen Antwort verwirrt.
Für eine IBBPBBI Film, die Sie erwarten würden, die PTSes, wie folgt Aussehen (in der Entschlüsselung Reihenfolge)
entsprechenden frames
Damit Sie angezeigt werden, fehlt eine, die ich zu Beginn der Sequenz aber ansonsten ist der Zeitstempel korrekt Aussehen.
Ich bin ziemlich sicher, Sie werden immer genaue Werte. Es könnte helfen, wenn du was von einem MPEG-stream als, nun ja, ein stream. In diesem Fall, der vor dem IBBPBB, die Sie dort sehen, die normalerweise auf einer anderen GOP. Vielleicht so etwas wie dies (mit gleicher notation wie ursprüngliche Frage):
Grundsätzlich sind die B-frames nach dem I-frames sind auf der Basis der I-Frames und die Letzte P-frame aus dem vorherigen GOP.
Während es macht logischen Sinn, um ein video zu starten, mit dabei:
Später muss es
Denken Sie daran, dass die Decodierung beliebigen B-frame erfordert einen vollständigen frame davor und danach. Also jedes paar von B-frames angezeigt werden soll, bevor das I-oder P-frame genau vor der in der Datei.
FFMPEG kann nur noch verzichtet die "speziellen Fall" der ersten GOP.
Da die ersten beiden B-frames nicht über eine Vorherige frame zu manipulieren, Sie sollten in der Lage sein, um sicher zu verwerfen. Nur rebase Ihre Zeitstempel aus der ersten I-Frames und passen Sie den audio-stream den gleichen Betrag.
Ob dies tatsächlich zu einem Verlust von frames wird davon abhängen, FFMPEG Implementierung, aber noch schlimmer-case-Szenario ist, dass Sie verlieren, 83 MS (2 frames bei 24 Bilder/Sek.).