crossfade entre 2 vídeos usando o ffmpeg

20

Estou tentando conseguir uma transição de crossfade entre dois videoclipes usando o ffmpeg, mas falhei até agora. Eu sou novo no ffmpeg e estou principalmente contando com ajustes o que eu posso encontrar na documentação e exemplos existentes online. Pelo que li até agora, usar o filtro blend ou overlay deve ajudar a alcançar o que estou procurando, mas não consigo descobrir os detalhes da linha de comando para obter para trabalhar.

Os filtros fade e de concat são ótimos para fade-out do vídeo 1, fade-in para video 2 e concatam as transições de tipo 2 em 1 clipe , mas eu Aprecie a ajuda na obtenção de um comando para a transição do vídeo 1 para o vídeo 2 sem qualquer indo para preto entre eles. Não encontrei exemplos para exatamente esse problema em nenhum lugar, talvez eu esteja procurando as palavras-chave erradas ...?

Mais especificamente, meus vídeos são mp4s (vídeo h264, sem som, caso isso seja importante), cada um com 5 segundos de duração e depois de uma transição de aprox. 4,5s do vídeo 1 a 0,5s do vídeo 2.

Semelhante ao que este tutorial faz usando MLT e frames (veja 2:25 para um fade de exemplo), embora eu esteja procurando uma maneira de fazer isso apenas no ffmpeg sem chamar nenhum outro prog. link

Qualquer ponteiro ou talvez uma linha de comando para obter um fade como este seria muito apreciado, muito obrigado!

    
por Mugba 09.07.2014 / 07:22

3 respostas

19

Sugiro fazer assim:

  • Crie um plano de fundo preto com a mesma duração e resolução que o vídeo de saída deve ser
  • Adicionar canal alfa a cada vídeo
  • Adicione o efeito de atenuação ao alfa a cada vídeo
  • Use sobreposição em cada vídeo com fundo preto

Assim, o comando para adicionar crossfade a 2 vídeos (5 seg.) deve ser:

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

Isso irá desvanecer primeiro vídeo para alfa no 4º segundo (st = 4) durante 1 segundo (d = 1), desaparecer no segundo em 0 segundo (st = 0) durante 1 segundo (d = 1) e move seu tempo de exibição para frente para 4 seg (+ 4 / TB). Em seguida, cortamos apenas 9 segundos da cor preta, dimensionamos o tamanho do vídeo e sobrepomos o material.

Espero que ajude.

    
por 09.07.2014 / 18:37
4

Foi assim que eu fiz:

  • versão ffmpeg N-77197-gdf2ce13
  • 2 vídeos de 4 segundos cada.
  • É necessário juntar-se a ele com o fade entre eles.
  • vídeos são 25 fps.

1) Adicione o fade out (claro a escuro) no final do primeiro e fade in (dark to light) no início do segundo:

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 que o fade out começará o frame 76 e terminará 24 frames depois = 1s fade out.

0:25 significa que o fade in iniciará o quadro 0 e terminará 25 quadros depois.

2) Mesclar os dois vídeos

Converta tudo em 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

Mesclar

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

Obrigado a:

link

    
por 14.12.2015 / 10:10
3

ffmpeg-concat é a maneira mais fácil de realizar o que você quer e permite que você use um monte de sexy Transições de OpenGL, com o padrão sendo crossfade.

ffmpeg-gl-transition é um filtro ffmpeg personalizado que permite usar o GLSL para facilitar a transição entre dois fluxos de vídeo. Este filtro é significativamente mais fácil de usar e personalizar do que as alternativas listadas aqui.

Esse filtro suporta uma grande lista de tipos de transição, com o padrão sendo crossfade.

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