FFprobe – Ist es möglich, die „gesuchte Position“ eines Videostreams zu erhalten, ohne ihn neu zu kodieren?

FFprobe – Ist es möglich, die „gesuchte Position“ eines Videostreams zu erhalten, ohne ihn neu zu kodieren?

Ich habe folgenden Befehl:

ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss 3 -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4

Wenn ich den Videostream kopiere, anstatt ihn neu zu kodieren, kann ich daraus keine brauchbaren Informationen extrahieren, ffprobedie mir die gesuchte Position des Videostreams verraten.

Ich habe versucht, Informationen zum gesamten Stream zu sammeln:

ffprobe -of json -show_streams -show_format output.mp4

Aber es start_timeist so 0und die Dauer bleibt davon unberührt. Ich habe auch versucht, Informationen zum ersten Frame des Videostreams zu sammeln:

ffprobe -of json -select_streams v -show_frames output.mp4

Immer noch keine brauchbaren Informationen.

Wenn ich den Videostream jedoch neu kodiere (indem ich -c:v copyaus dem Befehl entferne), erhalte ich die gewünschten Informationen. Die Dauer des Videostreams wird durch die -ssOption geändert. Wenn die Dauer des Videos beispielsweise 5 beträgt, ffprobewird eine Dauer von 2 (5 minus 3) zurückgegeben, wodurch ich die gesuchte Position erfahre. Wenn ich außerdem ein in -copytsdie Mischung einfüge, kann ich die nützlichen Informationen erhalten, indem ich die Informationen des ersten Frames überprüfe.

Wie kann ich die gewünschte Position erreichen, ohne den Videostream neu kodieren zu müssen? Prost!

Antwort1

Wenn Sie Zugriff auf die Originaldatei haben und

ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss X -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4

dann folgen Sie dieser Methode.

1) Dauer des Quellvideostreams abrufen

ffprobe source.mp4 -show_entries stream=duration -select_streams v -of compact=p=0 -v 0

Ausgabe zB

duration=229.033333

2) Dauer und erste PTS des resultierenden Videostreams abrufen

ffprobe output.mp4 -show_entries packet=pts_time:stream=duration -select_streams v -read_intervals 0%+#1 -of compact=p=0 -v 0

Ausgabe zB

pts_time=0.066667
duration=220.700000

Der erste Frame im Ergebnis ist also 229.033333 - 220.700000= 8.333333sdes Quellstreams.

Dies ist jedoch nicht der Wert -ss, da dieser -ssmöglicherweise nicht auf einen Keyframe verweist.

3) Ermitteln Sie also die Dauer und PTS des ersten Audiopakets. ffmpeg verlängert die Dauer, um das Audio mit dem angegebenen -ssFrame zu synchronisieren.

ffprobe output.mp4 -show_entries packet=pts_time,duration_time -select_streams a -read_intervals 0%+#1 -of compact=p=0 -v 0

Ausgabe zB

pts_time=0.000000|duration_time=2.733333

Also ist 8.333333s + 2.733333 - 0.000000 - 0.066667= 11.000000sder gesuchte Rahmen.

verwandte Informationen