Ich möchte nur ein mp4-Video mit ffmpeg loopen und die aktuellen Einstellungen und den Codec beibehalten.
Wenn beispielsweise die Datei input.mp4 0:10 lang ist und ich sie viermal in einer Schleife abspielen möchte, sodass die Datei output.mp4 0:40 lang ist, wie kann ich die folgende Befehlszeile ändern, um dies zu tun?
ffmpeg -i input.mp4 -c copy output.mp4
Ich habe es versucht...
ffmpeg -loop 4 -i input.mp4 -c copy output.mp4
... aber ich bekomme die Fehlermeldung "Optionsschleife nicht gefunden."
Antworten:
Concat Demuxer
Auf diese Weise können Sie einen Eingang in einer Schleife wiedergeben, ohne ihn neu codieren zu müssen.
Erstellen Sie eine Textdatei. Inhalt einer Beispieltextdatei, die viermal wiederholt werden soll.
Führen Sie dann Folgendes aus
ffmpeg
:Für Linux-Benutzer
Dieses Beispiel ist dasselbe wie oben, aber Sie müssen Folgendes nicht manuell vornehmen
list.txt
:Bei den meisten gängigen modernen Shells können Sie sogar die Erstellung der
list.txt
Datei ganz vermeiden . Zum Beispiel mit bash:Siehe auch:
Schleifenfilter
Beispiel für die Verwendung des Schleifenfilters zum 4-fachen Schleifen, jede Schleife besteht aus 75 Frames. Jede Schleife überspringt die ersten 25 Frames der Eingabe:
loop=3:75:25
loop=3
wird 4-mal wiederholt.-1
.ffmpeg -h filter=loop
.Filmfilter
Der Filmfilter verfügt über eine Schleifenoption. Siehe Antwort unten von Monah Tuk. Das Filtern erfordert eine Neucodierung. Verwenden Sie für Audio den Amovie-Filter.
-stream_loop
MöglichkeitSiehe Antwort unten von Thingy und Antwort von Gyan.
Beachten Sie, dass diese Option war Buggy (siehe Bug berichtet # 5719 , # 6121 und # 7043 ) , so kann keine Arbeit für Altbauten (etwas älter als 2018 06-27 einschließlich dem FFmpeg 4.0.x Release - Zweig). Für Benutzer von alten Builds, wie von mulvya in Ticket # 6121 erwähnt, besteht eine Problemumgehung darin, zuerst auf MKV oder TS zu re-muxen und dann
-stream_loop
im nächsten Befehl zu verwenden.-loop
MöglichkeitDie
-loop
Option ist spezifisch für den Bilddatei-Demuxer und den GIF- Muxer . Sie kann daher nicht für typische Videodateien verwendet werden, sondern dient zum Endlosschleifen einer Reihe von Eingabebildern. Dieses Beispiel wird immer wieder wiederholt, aber-t 30
die Ausgabedauer wird auf 30 Sekunden begrenzt:Oder um eine GIF-Ausgabe zu schleifen:
quelle
> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
-stream_loop
Abschnitt auf dasselbe Ticket verweist wie die erste ...Zumindest in FFmpeg 2.8.x (aber Oldie sollte auch funktionieren) können Sie
lavfi
als Eingabeformat und komplexes Filterdiagrammmovie
undsetpts
Filter als Argument für die-i
Option verwenden.Nächster Befehl, der diese Arbeit für Sie erledigt:
Null
loop=
Argumente bedeutet Endlosschleife. Werte größer Null setzen die Wiederholungszahl.setpts
Filter, die für die PTS-Anpassung für zweite und spätere Wiederholungen erforderlich sind, andernfalls schlagen die meisten Ausgangs-Muxer fehl, wenn der nicht-monotone PTS zunimmt: Die Schleife berechnet den PTS nicht neu.Beachten Sie, dass die Verwendung von Filtern unter der Annahme, dass die Umgehung von Frames ohne Decodierung / Codierung nicht möglich ist: Durch Design-Filter werden nur decodierte Frames behandelt.
Am FFmpeg 2.8.2 wurde eine neue Eingabemöglichkeit
-stream_loop
eingeführt. Ich schaue zuerst, es funktioniert einfacher und ermöglicht das Kopieren von Inhalten ohne Umcodierung:PTS wird jedoch nicht neu berechnet, und die Ausgabedatei ist falsch. Wenn Sie Filter hinzufügen, um PTS zu reparieren (siehe
setpts
), müssen Sie auch entfernen-c copy
. Nur Bitstream-Filter können mit codierten Paketen umgehen, aber es gibt keine Bitstream-Filter, mit denen PTS behoben werden kann (siehe: https://ffmpeg.org/ffmpeg-bitstream-filters.html ).In jedem Fall schlägt ffmpeg beim zweiten Durchgang mit Fehler fehl:
Bekannte Problemumgehung für mich : Container für Eingabedatei ohne PTS-Limits verwenden (Streaming-Container). Einer von ihnen, der mich kennt, ist MPEG-TS. So können Sie Ihre MP4-Datei einfach in MPEG-TS konvertieren:
Verwenden Sie den nächsten Befehl, um eine Infinity-Datei zu erstellen:
(Bitstream-Filter sollten nur bei Bedarf verwendet werden, bei meinen Samples ist dies erforderlich)
In diesem Fall ist FFmpeg> = 2.8.2 erforderlich.
quelle
-c copy
. Antwort behoben.Mit ffmpeg 2.8.4 erstellt der folgende Befehl output.mp4, eine sich wiederholende Kopie von input.mp4, bis der ffmpeg-Prozess gestoppt wird:
Dieser Befehl wird nicht von alleine beendet und die Ausgabedatei wächst unendlich.
quelle
F: "... wie könnte ich die folgende Befehlszeile ändern, um das zu tun? Ffmpeg -i input.mp4 -c copy output.mp4"?
A: Die einfache Methode, mit der Probleme vermieden werden, bei denen Befehle mit welcher Version funktionieren, ist die 'triviale Lösung':
ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c copy output.mp4
Siehe auch: https://trac.ffmpeg.org/wiki/Concatenate für viele Beispiele.
quelle