dissolvenza incrociata tra 2 video usando ffmpeg


27

Ho cercato di ottenere una transizione di dissolvenza incrociata tra 2 videoclip usando ffmpeg ma finora non sono riuscito. Sono nuovo di ffmpeg e per lo più mi affido a modificare ciò che posso trovare nella documentazione e negli esempi esistenti online. Da quello che ho letto finora, l'uso del filtro di fusione o di sovrapposizione dovrebbe aiutare a ottenere ciò che sto cercando, ma non riesco a capire i dettagli della riga di comando per farlo funzionare.

I filtri di dissolvenza e concaturazione sono ottimi per la dissolvenza in uscita del video 1, la dissolvenza in entrata al video 2 e la concatenazione delle transizioni di tipo clip 2 in 1, ma apprezzerei l'aiuto per ottenere un comando per passare dal video 1 al video 2 senza alcun andando in nero in mezzo. Non sono riuscito a trovare alcun esempio per questo problema esattamente da nessuna parte, forse sto cercando le parole chiave sbagliate ...?

Più specificamente, i miei video sono mp4 (video h264, nessun suono, nel caso sia importante), ognuno dura 5 secondi e sto cercando una transizione da ca. 4,5 secondi di video da 1 a 0,5 secondi di video 2.

Simile a quello che questo tutorial fa usando MLT e frame (vedi 2:25 per un esempio dissolvenza), anche se sto cercando un modo per farlo solo in ffmpeg senza chiamare altri prog. http://www.youtube.com/watch?v=3PRZ9L_KLdI

Qualsiasi puntatore o forse una riga di comando per ottenere una dissolvenza come questa sarebbe molto apprezzato, grazie mille!


Risposte:


23

Suggerisco di fare così:

  • Crea uno sfondo nero con la stessa durata e risoluzione del video in uscita
  • Aggiungi canale alfa a ciascun video
  • Aggiungi dissolvenza all'effetto alfa per ogni video
  • Usa la sovrapposizione su ogni video con sfondo nero

Quindi il comando per aggiungere la dissolvenza incrociata a 2 video (5 sec) ciascuno dovrebbe essere:

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

Questo dissolverà il primo video in alpha al 4 ° secondo (st = 4) durante 1 secondo (d = 1), si dissolverà nel secondo a 0 secondi (st = 0) durante 1 secondo (d = 1) e sposta il display tempo avanti a 4 sec (+ 4 / TB). Quindi tagliamo solo 9 secondi di colore nero, lo ridimensioniamo per produrre le dimensioni del video e sovrapponiamo il materiale.

Spero che sia d'aiuto.


Ciao @ptQa, grazie mille, l'effetto di dissolvenza incrociata funziona come un incantesimo. Anche se ciò che accade nel video di output è che mostra solo una sezione in alto a sinistra dei video originali e il resto del frame è mancante. Ho osservato la risoluzione, l'input è 960 x 720 e l'output è 320 x 240 ma non ridimensiona l'intero video, invece ritaglia una sezione 320 x 240 in alto a sinistra e mostra che nel video in uscita, il resto di mancano i video di input. C'è un'aggiunta alla tua riga di comando che impedisce questo?
Mugba,

Oh, l'ho capito, dovresti anche ridimensionare il colore nero in base alla risoluzione che desideri ottenere. Vedi la risposta aggiornata. Ho aggiunto la scala al filtro grafico.
ptQa,

Ciò ha risolto, grazie. Ho caricato un video di esempio che mostra la dissolvenza incrociata nel caso qualcuno volesse vederlo in azione, youtu.be/JqorgXAjjTo
Mugba,

Stesso problema; Ho una variante di questo lavoro su alcuni dei miei video - grazie. Domanda: come verrebbe modificato per dissolvere anche le tracce audio dei video, seguendo lo stesso schema della dissolvenza video?
Jim Miller,

1
A proposito, penso che ci sia un errore nel comando di esempio della risposta - dovrebbe essere -i 1.mp4 -i 2.mp4..., giusto?
Jim Miller,

7

Ecco come ho fatto:

  • versione ffmpeg N-77197-gdf2ce13
  • 2 video di 4 secondi ciascuno.
  • Devi unirti a loro con dissolvenza tra di loro.
  • i video sono 25 fps.

1) Aggiungi dissolvenza (da chiaro a scuro) alla fine del primo e dissolvenza in (da scuro a chiaro) all'inizio del secondo:

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24 significa che la dissolvenza inizierà il fotogramma 76 e finirà 24 fotogrammi in seguito = 1 s dissolvenza.

0:25 significa che la dissolvenza in entrata inizierà il fotogramma 0 e finirà 25 fotogrammi in seguito.

2) Unisci i 2 video

Converti tutto in TS

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

Merge

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

Grazie a:

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php


6
Questa non è una dissolvenza incrociata.
Gyan,

4
Cosa ha detto @Mulvya. Una dissolvenza incrociata sbiadisce una clip contemporaneamente a un'altra in dissolvenza. La prima clip ha la sua trasparenza costantemente aumentata per tutta la durata della dissolvenza incrociata; il secondo ha la sua trasparenza costantemente diminuita.
intuito

7

ffmpeg-concat è il modo più semplice per realizzare ciò che vuoi e ti consente di usare un sacco di transizioni OpenGL sexy, con il default è crossfade.

ffmpeg-gl-transizione è un filtro ffmpeg personalizzato che consente di utilizzare GLSL per passare agevolmente tra due flussi video. Questo filtro è significativamente più facile da usare e personalizzare rispetto alle alternative elencate qui.

Questo filtro supporta un ampio elenco di tipi di transizione, con l'impostazione predefinita dissolvenza incrociata.

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4

4
Hai mai pensato di inviare una patch a FFmpeg?
Llogan,

1
Lo farò sicuramente, devo solo risolvere alcuni piccoli problemi e testarne di più prima. Buona chiamata!
fisch2

è questo nel FFmpeg ufficiale? Non riesco a individuarlo
kraftydevil il
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.