Segmentieren von Videos in X-Sekunden-Teile mit ffmpeg

1

Ich habe ein Video mit einer Dauer von einer Minute und 35 Sekunden. Ich kann es in mehrere 30-Sekunden-Segmente aufteilen (ich kenne andere Möglichkeiten zum Aufteilen eines Videos, habe dies jedoch aus einem bestimmten Grund ausgewählt). Dies ergibt jedoch 3 Videos mit einer Länge von 30 Sekunden und ein Video mit einer Länge von 5 Sekunden. Was wäre der beste Weg, um ein schwankendes Video zu beseitigen, das weniger als 15 Sekunden dauert und an Segmente angehängt wird?

in Segmente aufteilen

ffmpeg -i test.mp4 -codec:v copy -codec:a copy -segment_time 30 test-%03d.mp4

Dauer

ffprobe -i test.mp4 -show_format -v quiet | grep '.=.'
MaryCoding
quelle
Sie möchten also, dass die Segmente 30, 30, 20 und 15 Sekunden lang sind?
Slhck
@slhck Ja, du bist richtig!
MaryCoding

Antworten:

1

ffmpeg alleine kann das nicht. Sie müssen die Dauer des einzelnen Segments selbst herausfinden, da es keine Möglichkeit gibt, eine Mindestdauer festzulegen.

Zu diesem Zweck würden Sie wahrscheinlich zweimal über die Gesamtlänge des Videos iterieren. Bestimmen Sie im ersten Lauf die Länge der Segmente. Wenn Sie feststellen, dass das letzte Segment kürzer als beispielsweise 15 Sekunden ist, müssen Sie lediglich die Länge des vorletzten Segments anpassen. Dies kann leicht mit Skriptsprachen durchgeführt werden.

Sobald Sie das haben, müssen Sie dem segmentMuxer die einzelnen Segmentdauern mitteilen :

-segment_times 0,30,60,80
slhck
quelle
ok, macht auf diese weise mehr sinn. Derzeit ist die Art und Weise, wie ich das Video segmentiere, ich muss dies expr:gte(t,n_forced*30)genau spezifizieren , um das Segment mit der korrekten Länge von 30 Sekunden zu erhalten. Wie kann ich expr:gte(t,n_forced*x)für mehrere Segmente angeben ?
MaryCoding
Ich würde nur den kleinsten gemeinsamen Nenner auswählen, z. B. 5 Sekunden. Es ist in Ordnung, wenn Sie alle 1 bis 10 Sekunden einen Keyframe erzwingen.
Slhck