ffmpeg Diashow mit Überblendung

1454
Michael

Ich habe gerade herausgefunden, wie man eine Diashow mit Überblendung erstellt. Es ist ein zweistufiger Prozess. Im ersten Schritt werden die Bilder mit einer Framerate von 0,5 (dh 2 Sekunden für jedes Bild) gelesen und ein Zwischenvideo mit einer Framerate 2 erstellt. Das bedeutet, dass jedes Bild viermal wiederholt wird. Im zweiten Schritt wird der Framerate-Filter angewendet. Das Ergebnis ist, dass jedes Bild 1,5 Sekunden lang angezeigt wird, gefolgt von einer Überblendung von 0,5 Sekunden.

ffmpeg -framerate 0,5 -i IMG_% 3d.jpg -r 2 -Codec: v mpeg4 temp.mp4

ffmpeg -i temp.mp4 -vf "framerate = fps = 25" -Codec: v mpeg4 out.mp4

Dieser zweistufige Prozess funktioniert gut, aber ich habe zwei Fragen:

  1. Ist es auch möglich, das gleiche Ergebnis in einem Schritt ohne Zwischenvideodatei zu erhalten?
  2. Wenn die Antwort auf die erste Frage nein lautet, kann mir bitte jemand zeigen, wie die obigen Befehle für eine verlustfreie Zwischendatei, z. B. RAWVIDEO, geändert werden müssen?

Danke, Michael

2
Warum brauchst du "mpeg4" als Codec? Wenn Sie diesen Encoder verwenden, ohne eine Ziel-Bitrate oder Qualitätsstufe einzustellen, führt dies zu einer schlechten Qualität. Ich würde lieber H.264 verwenden, es sei denn, Sie müssen ein Gerät gezielt ansprechen, das es nicht unterstützt. slhck vor 7 Jahren 0
Ich habe die Einstellungen für Bitrate und Qualitätsstufe im obigen Beispiel weggelassen, weil ich sie so kurz wie möglich halten wollte. Michael vor 7 Jahren 0

2 Antworten auf die Frage

2
Michael

Ich möchte die Lösung zusammenfassen:

ffmpeg -i IMG_%3d.jpg -vf zoompan=d=(A+B)/B:s=WxH:fps=1/B,framerate=25:interp_start=0:interp_end=255:scene=100 -c:v mpeg4 -maxrate 5M -q:v 2 out.mp4 

Dabei ist A die Dauer in Sekunden, wie lange jedes Bild angezeigt wird (ohne Überblendungsdauer), B ist die Überblendungsdauer in Sekunden und WxH ist die Größe des Ausgangsvideos.

"-b: v 5M" und "-q: v 0" schließen sich gegenseitig aus; Entweder möchten Sie eine bestimmte Bitrate (aber dann ist die Zwei-Pass-Kodierung besser), oder Sie geben eine Zielqualitätsstufe an (´-q: v 0` würde jedoch eine sehr große Datei ergeben). slhck vor 7 Jahren 0
Funktioniert die angegebene Bitrate in diesem Fall nicht nur maximal? Ich denke, wenn beide Parameter angegeben werden, bedeutet dies, dass die angegebene Qualität verwendet wird, die angegebene Bitrate jedoch nicht überschritten wird. Michael vor 7 Jahren 0
Nein, das ist der '-maxrate'-Parameter. Wenn Sie wirklich "mpeg4" benötigen, verwenden Sie beispielsweise "-q: v 2 -maxrate 5M" für ein 1080p-Video, um einen VBR-Stream mit begrenzter Geschwindigkeit zu erreichen. slhck vor 7 Jahren 0
1
Gyan

Sie können die Frames erneut anpassen, bevor Sie den Filter anwenden:

ffmpeg -i IMG_%3d.jpg -vf "setpts=N/0.5/TB,framerate=fps=25" -codec:v mpeg4 out.mp4 

Update : Der Framerate-Filter scheint beim Einlesen an die Eingangs-Framerate gebunden zu sein, also eine alt-Methode mit Pipes

ffmpeg -framerate 0.5 -i IMG_%3d.jpg -vf fps=2 -f nut - | ffmpeg -f nut -i - -vf framerate=25 -c:v mpeg4 out.mp4 

Eine einzeilige Problemumgehung:

ffmpeg -i IMG_%3d.jpg -vf zoompan=z=1:d=4:s=WxH:fps=2,framerate=25 -c:v mpeg4 out.mp4 

wobei W und H durch die Eingangsmaße ersetzt werden.

Aber das tut nicht dasselbe. Es wird ein Video erzeugt, bei dem die Überblendzeit 2 Sekunden beträgt. Wenn eine Überblendung endet, beginnt die nächste Überblendung sofort. Michael vor 7 Jahren 0
Workaround hinzugefügt Gyan vor 7 Jahren 0
Ok, ich verstehe was du meinst. Wenden Sie zuerst den FPS-Filter und dann den Framerate-Filter an. Aber ich rufe ffmpeg von einer Windows-Batchdatei auf. Ich denke, in diesem Fall muss ich die Befehle in zwei Zeilen schreiben und eine Zwischendatei verwenden. Michael vor 7 Jahren 0
Warum? Sie können die Problemumgehung in einer Batchdatei anwenden. Gyan vor 7 Jahren 0
Es funktioniert nicht Wenn ich die Batchdatei starte, wird das cmd.exe-Fenster geöffnet und sofort geschlossen. Dies ist der Inhalt meiner Batch-Datei: c: / ffmpeg / ffmpeg -framerate 0.5 -i IMG _ %% 3d.jpg -vf fps = 2 -f nut - | c: / ffmpeg / ffmpeg -f mutter -i - -vf framerate = 25 -c: v mpeg4 out.mp4 pause Michael vor 7 Jahren 0
Der Befehl pause befindet sich in einer neuen Zeile Michael vor 7 Jahren 0
Die einzeilige Workaround mit Zoompan-Filter funktioniert hervorragend! Es gibt einen kleinen Tippfehler, ersetzen Sie "d: 4" durch "d = 4". Vielen Dank! Michael vor 7 Jahren 0
"Framerate 0.5" am Anfang kann weggelassen werden. "z = 1" kann auch weggelassen werden, es ist der Standardwert. Michael vor 7 Jahren 0