Angenommen, ich habe eine MP3-Datei von 1 Minute Länge. Und ich habe 20 PNG-Bilder. Ich möchte diese Bilder und ein Audio in einer Videodatei kombinieren, aber ich möchte nicht, dass jedes Bild 3 Sekunden auf dem Bildschirm hält, ich möchte, dass einige Bilder 5 Sekunden halten, andere 1 Sekunde usw.
Die einzige Möglichkeit, die mir in den Sinn kommt, besteht darin, die Bilder zu kopieren, die länger halten sollen, z.
Dies ist jedoch sehr zeit- und platzaufwendig. Gibt es einen Schalter / Parameter in ffmpeg, mit dem ich das machen kann?
Antworten:
Für die Verwendung von ffmpeg 2.0 gibt es verschiedene Möglichkeiten:
Eine Methode besteht darin, Dateiänderungszeiten zu verwenden. Zuerst stellen Sie den Zeitpunkt der letzten Änderung der Bilddateien , so dass jede Bilddatei eine Änderungszeit größer als der andere hat; Der Zeitunterschied ist die Dauer des vorherigen Bildes (mit einer Auflösung von 1 Sekunde). Verwenden Sie dann die Option image2 demuxer
-ts_from_file 1
. Beispielsweise:Eine andere Methode ist die Verwendung des
concat
Demuxers , der eine Liste der zu verkettenden Dateien mit optionaler Dauer benötigt. Erstellen Sie zunächst eine Datei, in der Ihre Bilder und die Dauer aufgeführt sind, die wie folgt aussieht:Stellen Sie dann diese Datei als Eingabe für ffmpeg bereit. Beispielsweise:
Möglicherweise müssen Sie die letzte Datei nach der endgültigen Dauer duplizieren.
-c:a copy
kopiert das MP3-Audio wie es ist; Wenn Sie es in einen anderen Audio-Codec konvertieren möchten, können Sie dies anstelle von angebencopy
. Möglicherweise möchten Sie auch einen anderen Videocodec mit-c:v
oder ein anderes Pixelformat mit angeben-pix_fmt
, z-c:v libx264 -pix_fmt yuv420p
.-vf fps=25
macht die Ausgangsbildrate 25 fps. Wenn Ihr Audio länger ist und Sie möchten, dass es nach den Bildern abgeschnitten wird, verwenden Sie die-shortest
Option.quelle
-c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4
statt out.avi oder versuchen Sie es mit einem anderen Player wie mpv oder ffplay. Stellen Sie außerdem sicher, dass Sie eine aktuelle Version von FFmpeg verwenden, und duplizieren Sie den letzten Bilddateinamen nach der endgültigen Dauer.Vorausgesetzt
ffmpeg -i in.ffconcat -vf fps=25 out.avi
(2018: in.ffconcat Dateiinhalt) - das funktioniert:
während dies nicht der Fall ist
dh im zweiten Fall
ffprobe out.avi -show_entries format=duration -v 0
quelle