ffmpeg Stream Kopie Frame-Genauigkeit

ffmpeg Stream Kopie Frame-Genauigkeit

Ich weiß, dass das vielleicht nicht möglich ist, aber ich wäre zumindest dankbar, wenn ich verstehen würde, was los ist.

Ich habe ein Video mit erzwungenen Keyframes alle 2 Sekunden. Im Idealfall hätte ich gehofft, dass ich bildgenaue Slices erhalten könnte, ohne sie neu kodieren zu müssen. Beispiel:

ffmpeg -ss 00:00:00 -i original.mp4 -t 2 -c copy slices_0.mp4
ffmpeg -ss 00:00:02 -i original.mp4 -t 2 -c copy slices_1.mp4
ffmpeg -ss 00:00:04 -i original.mp4 -t 2 -c copy slices_2.mp4
...

Das scheint nicht ganz zu funktionieren.

Bei genauerem Hinsehen sieht es so aus, als ob der erste Abschnitt bildgenau ist, aber alles danach leicht versetzt ist (es könnte andere Probleme geben, aber darauf konzentriere ich mich jetzt nur). Das erste Bild scheint in Ordnung zu sein:

# same output
ffmpeg -ss 00:00:03 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:00 -i slices_1.mp4 -vframes 1 1.png && md5 1.png

Aber alles danach ist aus:

# not the same output
ffmpeg -ss 00:00:04 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:01 -i slices_1.mp4 -vframes 1 1.png && md5 1.png

Was auch immer ich mache, ich erhalte das gleiche Ergebnis. Wenn ich mir das PTS für das Original für Frame 60 anschaue, erhalte ich 2,002000 (anstelle von 2). Aber selbst wenn ich dies für meinen Slice verwende, erhalte ich den gleichen Offset.

Was ist los?

(Hat wahrscheinlich nichts damit zu tun, aber ich frage mich auch, warum das erste Bild von 0_slices.mp4 einen PST/DST-Offset hat, obwohl das Original keinen hat.)

Antwort1

Wenn Sie eine rahmengenaue Suche wünschen, versuchen Sie, Ihr -ssFlag nach Ihrer Eingabedatei zu platzieren.

Also ungefähr so:

ffmpeg -i original.mp4 -ss 00:00:04 -vframes 1 -f image2 0.png.

Das Platzieren der ssFlagge vor der Eingabedatei ist in Bezug auf PTS eine „grobe Schätzung“, muss aber an einem I-Frame ausgerichtet sein, damit es funktioniert. Dies geht viel schneller, als wenn Sie die ssFlagge nach Ihrer Eingabedatei platzieren, ist aber weniger genau.

ssWenn Sie das Flag nach der Eingabedatei setzen , dekodiert FFmpeg vom Anfang der Datei bis zum -ssBeginn Ihrer Zeit. Anschließend werden alle Informationen vor Ablauf der Zeit ausgegeben. ssEs dauert also viel länger, sollte aber genau sein.

verwandte Informationen