FFMPEG-Bildsequenz mit unterschiedlicher Dauer

16

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?

Flot2011
quelle
Wie Sie herausgefunden haben, sollte ffmpeg jedes Bild in der gleichen Länge anzeigen. Wenn Sie die Länge variieren möchten, müssen Sie die Bilder zuvor duplizieren oder separate Videos mit der gewünschten Dauer erstellen und sie dann verketten. Vielleicht haben einige andere Benutzer bessere Ideen, aber diese Art von Aufgabe könnte mit einem Editor wie Kdenlive usw. einfacher sein.
llogan
Ich mache es aus PHP-Skript, also ist Editor nicht das, wonach ich suche.
Flot2011

Antworten:

21

Für die Verwendung von ffmpeg 2.0 gibt es verschiedene Möglichkeiten:

  1. 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:

    touch -t 01010000.00 image01.png
    touch -t 01010000.03 image02.png
    touch -t 01010000.08 image03.png
    ...
    ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
    
  2. Eine andere Methode ist die Verwendung des concatDemuxers , 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:

    ffconcat version 1.0
    file image01.png
    duration 3
    file image02.png
    duration 5
    file image03.png
    

    Stellen Sie dann diese Datei als Eingabe für ffmpeg bereit. Beispielsweise:

    ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
    

Möglicherweise müssen Sie die letzte Datei nach der endgültigen Dauer duplizieren. -c:a copykopiert das MP3-Audio wie es ist; Wenn Sie es in einen anderen Audio-Codec konvertieren möchten, können Sie dies anstelle von angeben copy. Möglicherweise möchten Sie auch einen anderen Videocodec mit -c:voder ein anderes Pixelformat mit angeben -pix_fmt, z -c:v libx264 -pix_fmt yuv420p. -vf fps=25macht die Ausgangsbildrate 25 fps. Wenn Ihr Audio länger ist und Sie möchten, dass es nach den Bildern abgeschnitten wird, verwenden Sie die -shortestOption.

mark4o
quelle
Irgendeine Idee, warum dies nicht zu funktionieren scheint (ich meine, ich bin der zweiten (und der ersten) Option gefolgt), aber es wird entweder nur ein schwarzes Video ohne Bilder ausgegeben oder die Bilder blinken nur für ein Bild, nicht für mehrere Sekunden wie in der ffconcat-Datei angegeben.
sup
@sup: Das funktioniert bei mir immer noch. Wenn das Video schwarz ist, unterstützt Ihr Player möglicherweise nicht das von Ihnen verwendete Videoformat. versuchen Sie es -c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4statt 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.
mark4o
Hm, komisch, du verwendest mpv und den statischen ffmpeg-Build, der von ffmpeg.org heruntergeladen wurde, und ignoriert nur die Dauer. Wie auch immer, ich habe einen anderen Weg gefunden, es ist also nicht so wichtig: ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
sup
1

Vorausgesetzt ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018: in.ffconcat Dateiinhalt) - das funktioniert:

ffconcat Version 1.0
Datei text.png
Dauer 30.0
Datei text.png

während dies nicht der Fall ist

ffconcat Version 1.0
Datei text.png
Dauer 30.0

dh im zweiten Fall

ffprobe out.avi -show_entries format=duration -v 0

[FORMAT]
Duration = 0.040000
[/FORMAT]
Darek Adamkiewicz
quelle