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, ffprobe
die 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_time
ist so 0
und 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 copy
aus dem Befehl entferne), erhalte ich die gewünschten Informationen. Die Dauer des Videostreams wird durch die -ss
Option geändert. Wenn die Dauer des Videos beispielsweise 5 beträgt, ffprobe
wird eine Dauer von 2 (5 minus 3) zurückgegeben, wodurch ich die gesuchte Position erfahre. Wenn ich außerdem ein in -copyts
die 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.333333s
des Quellstreams.
Dies ist jedoch nicht der Wert -ss, da dieser -ss
mö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 -ss
Frame 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.000000s
der gesuchte Rahmen.