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.