Crea video con 5 immagini con effetto dissolvenza in apertura / chiusura in ffmpeg


27

Con 5 immagini devo creare un video di 60 secondi in ffmpeg, ogni immagine deve essere visualizzata per 15 secondi. dopo 15 secondi, la prima immagine deve svanire e la 2a immagine deve svanire, dopo che la 2a immagine deve svanire, la 3a immagine deve svanire in ... ecc. Per favore guidami come posso ottenere questo usando i comandi ffmpeg.


4
Che cosa hai provato e quindi possiamo aiutarti? Questo forum non è un tipo di forum "per favore dammi la risposta senza fare alcun lavoro". Detto questo, ti fornirò il collegamento alla documentazione di ffmpeg fade - ffmpeg.org/ffmpeg-filters.html#fade
Mike Diglio,

Risposte:


49

Dip / dissolvenza al nero

Scorri verso il basso per il metodo di dissolvenza incrociata.

esempio di dissolvenza

Esempio in cui ogni immagine viene visualizzata per 5 secondi e ciascuna ha una dissolvenza che dura 1 secondo. Ogni input di immagine ha la stessa larghezza, altezza e proporzioni del campione. Se variano di dimensioni, vedere l'esempio n. 3 di seguito.

Uscita MP4

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Con audio

Come sopra ma con audio:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Per immagini di input con dimensioni variabili o arbitrarie

Come il primo esempio, ma con immagini di input che variano in larghezza x altezza. Saranno imbottiti per adattarsi a una scatola di 1280x720:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Vedi gli esempi in Ridimensionamento dei video per adattarli a un lettore di dimensioni statiche se vuoi ritagliare (riempi lo schermo) invece di pad (letterbox / pillarbox), o se vuoi impedire l'upscaling.

Uscita GIF

Aggiunge i filtri da Come posso convertire un video in GIF usando ffmpeg, con una qualità ragionevole?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Utilizzare l' -loopopzione di output per controllare il numero di volte in cui i loop GIF. L'impostazione predefinita è ciclo infinito se questa opzione non viene utilizzata. Un valore di -1non è un ciclo.

Opzioni e filtri utilizzati:

  • -t per impostare la durata in secondi di ciascun ingresso.

  • -loop 1 avvolge l'immagine altrimenti avrebbe una durata di 1 fotogramma.

  • -framerateper impostare la frequenza dei fotogrammi dell'immagine di input (l'impostazione predefinita quando non dichiarata è 25). Utile per creare GIF.

  • ridimensionare con il pad per adattare le immagini di input a una dimensione specifica e uniforme (utilizzata nell'esempio n. 3).

  • dissolvenza per dissolvenza in entrata e in uscita. dè la durata della dissolvenza. stè quando inizia.

  • concat per concatenare (o "join") ogni immagine.

  • formatta per produrre uno schema di sottocampionamento chroma compatibile con lettori non basati su FFmpeg se emette MP4 e codifica con libx264 (il codificatore predefinito per l'output MP4 se supportato dalla tua build).

  • diviso per fare copie di un filtro di output. Necessari dalla palette * filtri per fare tutto in un solo comando.

  • palettegen e paletteuse per rendere piacevole l'aspetto GIF.


crossfade

esempio di dissolvenza incrociata

Esempio in cui ogni immagine viene visualizzata per 5 secondi e ciascuna ha una dissolvenza incrociata che dura 1 secondo. Ogni input di immagine ha la stessa larghezza, altezza e proporzioni del campione. Se variano in dimensioni, adatta l'esempio n. 3 sopra.

Uscita MP4

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

Con audio

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

Dissolvenza incrociata tra due video con audio

Seleziona un segmento di 5 secondi da ciascun ingresso e aggiungi una dissolvenza incrociata di 1 secondo:

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

Uscita GIF

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Utilizzare l' -loopopzione di output per controllare il numero di volte in cui i loop GIF. L'impostazione predefinita è ciclo infinito se questa opzione non viene utilizzata. Un valore di -1non è un ciclo.


1
@LordNeckbeard, grazie per questa risposta, l'ho usato per un altro esempio. Ho capito bene che numero che segue -tnella -loop 1 -t 1 -i 001.pngdefinisce la durata dei singoli fotogrammi, e che i numeri seguenti T/all'interno di filter_complexblocco definisce la durata della transizione? E la durata del frame in questo esempio viene conteggiata includendo la durata della transizione o no?
cincplug

1
@Nisarg Questo non sembra essere l'output completo e non sono sicuro di quale comando provenga dai due che hai visualizzato in precedenza. Ad ogni modo, prova ad aggiungere -preset ultrafast.
Llogan,

1
@LordNeckbeard Devo combinare un set di immagini, clip video e una traccia audio per creare un singolo file video (preferibilmente ogg, ma che è meno rilevante a questo punto). Inoltre, devo creare alcuni effetti di transizione tra immagini adiacenti. Esiste un modo per eseguire lo script dell'intera attività utilizzando ffmpeg e / o altri strumenti da riga di comando? L'obiettivo è automatizzare l'attività tramite un'interfaccia della riga di comando.
Utente Web

1
Le transizioni di @WebUser saranno probabilmente più facili da usare melt.
Llogan,

2
L'approccio ffmpeg funziona bene per me; Grazie! Un consiglio per i nuovi arrivati ​​alla pagina; nella concat=n=9parte del comando, il 9proviene dalle 5 immagini nell'esempio + 4 transizioni tra le immagini. Se stai gestendo un numero diverso di immagini, dovrai modificarlo di conseguenza.
Jim Miller,

4

Ho scritto uno script bash generale che porta in un percorso a una cartella di immagini e produce un video con dissolvenza incrociata con ffmpeg:

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

Lo script esamina essenzialmente le immagini in una cartella e stampa un comando simile alla risposta di @LordNeckbeard sopra, ed esegue il comando. Questo script aiuta quando hai molte immagini in una cartella e non vuoi digitare manualmente un comando deprimentemente lungo.


Siamo spiacenti, ma lo script non riesce con ffmpeg 3.0.1, con input da 0 a 4 restituisce: "Indice file 5 non valido nella descrizione del filtro"
Krzysztof Bociurko

TobySpeight: buon punto, ho modificato la risposta per essere più chiaro. Fondamentalmente l'idea principale è già stata fornita da @LordNeckbeard sopra. Questo script generalizza solo molte immagini.
anh_ng8,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.