So dekodieren Sie die PTS-Zeitstempel und extrahieren die Videoframes

Ich möchte die Videoframes extrahieren und den PTS-Zeitstempel für jeden von ihnen erhalten. Ich habe eine MPEG-2 TS-Eingabedatei und verwende lieber ein Open-Source-Tool wie ffmpeg oder ähnliches. Das Problem ist, dass, wenn ich die -vf showinfoOption verwende, mir ein umgestempelter PTS angezeigt wird. Dies ist der Befehl, den ich verwende:

ffmpeg -hide_banner -i input.ts -vf showinfo -vsync 0 -start_number 0 fr%05d.jpg &> log.txt

Also hier ist mein Ergebnis etwas Ähnliches wie:

[Parsed_showinfo_0 @ 0x5629810a2000] n: 435 pts:1593000 pts_time:17.7    pos: 55729780 fmt:yuv420p sar:1/1 s:1920x1080 i:T iskey:0 type:B checksum:27AB3255 plane_checksum:[B27F2CE8 F1689963 59E56BFB] mean:[142 127 129] stdev:[36.5 2.8 4.1]
[Parsed_showinfo_0 @ 0x5629810a2000] n: 436 pts:1596600 pts_time:17.74   pos: 55690112 fmt:yuv420p sar:1/1 s:1920x1080 i:T iskey:0 type:B checksum:94AD9CBE plane_checksum:[FB0C9721 C477122C 2AA6F362] mean:[142 127 129] stdev:[36.5 2.8 4.1]

Während ich den Befehl ffprobe ausführe:

$ ffprobe -i input.ts -show_frames -select_streams v:0 -print_format flat | grep pkt_pts=

frames.frame.435.pkt_pts=4205067450
frames.frame.436.pkt_pts=4205071050

Und ich muss den pkt_pts-Zeitstempel der extrahierten Dateien möglicherweise mit nur einem Befehl herausfinden. Außerdem habe ich den SCTE-35 überprüft und dort hatte ich einen Versatz von 150 Frames zwischen den Insert-Intervallen. Zum Beispiel laut PKT_PTS sind die Start- und Stopp-Frames 1650 und 2550, die über SCTE-35 signalisiert werden, aber die tatsächlichen Frames sind 1500 2400, wenn ich nur auf die extrahierten Frames schaue.

Antworten (1)

FFmpeg entfernt standardmäßig den Start-Offset. Um es beizubehalten, fügen Sie hinzu -copyts.

Die Beschreibung von -vsync 0ist nicht korrekt und wurde vor über 8 Jahren geschrieben: Jeder Frame wird mit seinem Zeitstempel vom Demuxer zum Muxer weitergegeben. . Die Videosynchronisierung wird erst wirksam, wenn der Frame die Decoder(+Filtergraph)-Pipeline verlassen hat. Aber Sie sollten es behalten, um das Löschen/Duplizieren von Frames zu vermeiden.

ja, das funktioniert super, danke für den Hinweis! Ich habe einfach nicht verstanden, ob ich es -vsync 0in meiner Befehlszeile verwenden sollte oder nicht.