Mit FFMPEG Video aus Bildern und Audio mit unterschiedlicher Bilddauer erstellen?

0

Was ich machen will; was ich vorhabe zu tun:

Ich habe x Bilder png / jpg, und ich möchte sie für eine unterschiedliche Dauer zeigen, einige länger und einige kürzer.

  • a1.jpg Das erste Foto bleibt 3 Sekunden lang
  • a2.png bleibt 10 Sekunden lang
  • a3.jpg bleibt bis zum Ende des Audios

Video sollte so lang sein wie audio.mp3

Dies ist mein Code so weit nach dem Lesen der Dokumentation, nicht sicher, was falsch ist, ich bekomme beschädigtes Video ohne Ton und nur das letzte Bild.

Möchte auch Bilder zentrieren, wenn möglich.

ffmpeg -y \
  -loop 1 -t 1 -i a1.jpg \
  -loop 1 -t 1 -i a2.jpg \
  -loop 1 -t 4 -i a3.jpg \
  -loop 1 -t 1 -i a4.png \
  -loop 1 -t 1 -i a5.png \
  -i audio.mp3 \
  -c:v libx264 -pix_fmt yuv420p -c:a copy video.mp4

Versuchen

ffmpeg -y -framerate 15 \
  -loop 1 -t 1 -i a1.jpg \
  -loop 1 -t 1 -i a2.jpg \
  -loop 1 -t 4 -i a3.jpg \
  -loop 1 -t 1 -i a4.png \
  -loop 1 -t 1 -i a5.png \
  -i audio.mp3 \
  -c:v libx264 -pix_fmt yuv420p -c:a copy \
  -filter_complex " \
  [0]setdar=16/9[a1],[a1]scale=720x406[a];[1]setdar=16/9[b1],[b1]scale=720x406[b];[2]setdar=16/9[c1],[c1]scale=720x406[c];[3]setdar=16/9[d1],[d1]scale=720x406[d];[4]setdar=16/9[e1],[e1]scale=720x406[e]; 
  [a][b][c][d][e]concat=n=5,format=yuv420p[v],[v]scale=720x406[v1],[v1]setdar=16/9[v2]" \
  -map "[v2]" -c:a copy out.mp4
Muhammad Umer
quelle

Antworten:

2

Grundvorlage ist

ffmpeg -y \
  -loop 1 -t 1 -i a1.jpg \
  -loop 1 -t 1 -i a2.jpg \
  -loop 1 -t 4 -i a3.jpg \
  -loop 1 -t 1 -i a4.png \
  -loop 1 -i a5.png \
  -i audio.mp3 \
  -filter_complex "concat=n=5" -shortest \
  -c:v libx264 -pix_fmt yuv420p -c:a aac video.mp4

Das t Die Spezifikation für jedes Bild legt seine Dauer fest. Das t für das letzte Bild sollte weggelassen werden, wenn das Video bis zum Ende des Audios andauern soll.

Ich verwende den concat-Filter, um alle Videoeingänge zu verbinden. Es empfiehlt sich, zu kennzeichnen, welche Eingänge der Concat-Filter verbindet, aber wenn er nicht angegeben ist, greift der Filter das erste N an -i Eingänge, wobei N der im Concat-Filter eingestellte Wert ist. Alle Bilder müssen die gleiche Auflösung und das gleiche Seitenverhältnis haben.

Der von Ihnen eingegebene Befehl kopiert das Audio, aber MP3 ist in MP4 nicht Standard, obwohl dies zulässig ist, und einige Player, wie Quicktime, können die Datei nicht wiedergeben. Deshalb habe ich es in AAC geändert.


Ändern Sie für Bilder ungleicher Größe filter_complex in

"[0]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i0];
 [1]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i1];
 [2]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i2];
 [3]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i3];
 [4]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i4];
 [i0][i1][i2][i3][i4]concat=n=5"

W und H sollten durch numerische Werte für die Zielvideobreite und -höhe ersetzt werden.

Gyan
quelle
Wäre es möglich, jedes Bild auf eine definierte Auflösungshöhe zu skalieren? Angenommen, ich stelle die Auflösung auf 720/460 ein ... und wenn eine Bildhöhe niedriger als diese ist, skaliere sie auf 460. Die gleiche Höhe und Breite würde eine andere Operation erfordern, um sie alle so zu machen
Muhammad Umer
Nun, die gleiche Auflösung - W und H - ist erforderlich, egal ob innerhalb oder außerhalb von ffmpeg.
Gyan
Kann ich davon ausgehen, dass das erste Bild die Zielauflösung ist?
Gyan
Ok ja das kann angenommen werden
Muhammad Umer
1
Ja, aber die Ausgabe ist nicht weitgehend kompatibel.
Gyan