Videoeingang mit ffmpeg wiederholen / loopen?


52

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."


Benutze quicktime 7 pro und mov container. Sie erhalten also keine größere Datei als mit OpenSource.
Дмитрий Мышков

Antworten:


69

Concat Demuxer

Auf diese Weise können Sie einen Eingang in einer Schleife wiedergeben, ohne ihn neu codieren zu müssen.

  1. Erstellen Sie eine Textdatei. Inhalt einer Beispieltextdatei, die viermal wiederholt werden soll.

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. Führen Sie dann Folgendes aus ffmpeg:

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Für Linux-Benutzer

Dieses Beispiel ist dasselbe wie oben, aber Sie müssen Folgendes nicht manuell vornehmen list.txt:

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

Bei den meisten gängigen modernen Shells können Sie sogar die Erstellung der list.txtDatei ganz vermeiden . Zum Beispiel mit bash:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

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:

ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
  • Oder benutze die Kurzschrift: loop=3:75:25
  • Das Filtern erfordert eine Neucodierung.
  • Dieser Filter platziert alle Bilder im Speicher .
  • Mit loop=3wird 4-mal wiederholt.
  • Zum Endlosschleifen verwenden -1.
  • Sie müssen die Anzahl der zu wiederholenden Frames angeben (im obigen Beispiel als 75 angegeben). Maximaler Wert ist 32767.
  • Siehe auch 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öglichkeit

Siehe 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_loopim nächsten Befehl zu verwenden.


-loop Möglichkeit

Die -loopOption 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 30die Ausgabedauer wird auf 30 Sekunden begrenzt:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

Oder um eine GIF-Ausgabe zu schleifen:

ffmpeg -i input -loop 3 output.gif

Funktioniert das gut mit mp4-Dateien?
Thomas King

3
Ich erhalte diesen Fehler> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
JZ11

1
@jamesfzhang - Ich denke, das liegt daran, dass Sie einen absoluten Pfad zur Datei benötigen (wie hier erklärt: trac.ffmpeg.org/wiki/Concatenate ). Um dies zu erreichen, könnten Sie schreiben: ffmpeg -safe 0 -f concat -i <(für i in {1..4}; mache printf "file '$ PWD' / '% s' \ n" input.mp4; done ) -c copy output.mp4
Plenus Franckly

1
Was mich betrifft, funktioniert dies, um ein Vollzeitvideo zu wiederholen, ohne die Berühmtheiten viermal zu überspringenffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
Vlad,

Diese Ausgabe ist 4 Jahre alt und niemand hat bemerkt, dass der Link zur zweiten Ausgabe in diesem -stream_loopAbschnitt auf dasselbe Ticket verweist wie die erste ...
Leonid Usov

15

Zumindest in FFmpeg 2.8.x (aber Oldie sollte auch funktionieren) können Sie lavfials Eingabeformat und komplexes Filterdiagramm movieund setptsFilter als Argument für die -iOption verwenden.

Nächster Befehl, der diese Arbeit für Sie erledigt:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

Null loop=Argumente bedeutet Endlosschleife. Werte größer Null setzen die Wiederholungszahl. setptsFilter, 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_loopeingeführt. Ich schaue zuerst, es funktioniert einfacher und ermöglicht das Kopieren von Inhalten ohne Umcodierung:

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

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:

input.mp4: Resource temporarily unavailable

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:

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

Verwenden Sie den nächsten Befehl, um eine Infinity-Datei zu erstellen:

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(Bitstream-Filter sollten nur bei Bedarf verwendet werden, bei meinen Samples ist dies erforderlich)

In diesem Fall ist FFmpeg> = 2.8.2 erforderlich.


1
Das Ausführen dieses Befehls führt zu folgender Fehlermeldung: "[mp4 @ 00000000053fa1a0] Tag für Codec-Rohvideo in Stream Nr. 0 konnte nicht gefunden werden, Codec wird derzeit im Container nicht unterstützt". Wenn ich -vcodec h264 vor der Eingabe hinzufüge, verschwindet dieser Fehler, aber der Encoder wird nicht beendet. Die Angabe einer Schleifenanzahl ungleich Null führt zu vielen Fehlern, wird jedoch beendet. Die Datei ist keine gültige Ausgabe.
Gyan

1
In der Dokumentation zu stream_loop heißt es: "Schleife 0 bedeutet keine Schleife, Schleife -1 bedeutet Endlosschleife."
Gyan

Scheint falsche Eingabedateien. Könnten Sie bitte teilen? "Schleife 0 bedeutet keine Schleife, Schleife -1 bedeutet Endlosschleife." - Anscheinend sehe ich alte Dokumente :-)
Monah Tuk

1
Ich habe vergessen: Filter, die Transcodierung annehmen (decodieren / codieren). Von Entwurf. Sie müssen also entfernen -c copy. Antwort behoben.
Monah Tuk

1
Gut zu wissen, aber das ist eine erhebliche Einschränkung, wenn Sie eine große Schleife erzeugen müssen.
Gyan

14

Mit ffmpeg 2.8.4 erstellt der folgende Befehl output.mp4, eine sich wiederholende Kopie von input.mp4, bis der ffmpeg-Prozess gestoppt wird:

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

Dieser Befehl wird nicht von alleine beendet und die Ausgabedatei wächst unendlich.


2
Scheint die schnellste Methode zu sein
Josef

2
Die schnellste Methode ist eine Untertreibung. Mit dieser Methode können Sie innerhalb von Sekunden stundenlange Videos erstellen.
SleighBoy

Dies ist eine sehr praktische Methode, da keine Datei mit sich wiederholenden Zeilen erstellt werden muss.
Markus Zeller

-1

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.


2
Dies führt keine Verkettung durch. Mindestens eine der concat-Methoden muss verwendet werden: Protokoll, Filter oder Demuxer. Bei diesem Befehl wählt die automatische Zuordnung von ffmpeg aus den Eingängen ein Video, ein Audio und einen Untertitel-Stream aus. Da sie identisch sind, entspricht dies dem ersten Befehl des OP.
Gyan

Dank für die Prüfung , dass Mulvya, wie es aus dem Verhalten unterscheidet sich in der Dokumente beschrieben: ffmpeg.org/ffmpeg.html#Description - Wenn es Ähnlichkeit in den Dateinamen „-i -i /tmp/test%d.mp4“ mit ( et al.) ist ebenfalls möglich.
Rob
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.