crossfade entre 2 vídeos usando ffmpeg


27

Eu tenho tentado alcançar uma transição de crossfade entre 2 clipes de vídeo usando ffmpeg, mas falhei até agora. Eu sou novo no ffmpeg e confio principalmente em ajustar o que posso encontrar na documentação e nos exemplos existentes online. Pelo que li até agora, usar o filtro de mistura ou de sobreposição deve ajudar a alcançar o que estou procurando, mas não consigo descobrir os detalhes da linha de comando para fazê-lo funcionar.

Os filtros fade e concat são ótimos para o desvanecimento do vídeo 1, o desvanecimento para o vídeo 2 e as transições do tipo de clipe 2 para 1, mas eu apreciaria a ajuda para obter um comando de transição do vídeo 1 para o vídeo 2 sem nenhuma ficando preto no meio. Não encontrei exemplos para esse problema exatamente em nenhum lugar, talvez esteja procurando as palavras-chave erradas ...?

Mais especificamente, meus vídeos são mp4s (vídeo h264, sem som, caso isso importe), cada um tem 5 segundos de duração e estou após uma transição de aprox. 4.5s de vídeo 1 a 0.5s de vídeo 2.

Semelhante ao que este tutorial faz usando MLT e quadros (veja 2:25 para um exemplo de desbotamento), embora eu esteja procurando uma maneira de fazer isso apenas no ffmpeg sem chamar outros progs. http://www.youtube.com/watch?v=3PRZ9L_KLdI

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


Respostas:


23

Eu sugiro fazer dessa maneira:

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

Portanto, o comando para adicionar crossfade a 2 vídeos (5 segundos) cada 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 diminui o primeiro vídeo para alfa no 4º segundo (st = 4) durante 1 segundo (d = 1), diminui no segundo em 0 segundo (st = 0) durante 1 segundo (d = 1) e move sua exibição tempo para 4 segundos (+ 4 / TB). Depois, cortamos 9 segundos da cor preta, escalamos para produzir o tamanho do vídeo e sobrepomos o material.

Espero que ajude.


Oi @ptQa, muito obrigado, o efeito crossfade funciona como um encanto. Embora o que acontece no vídeo de saída seja que ele mostre apenas uma seção superior esquerda dos vídeos originais e o restante do quadro esteja ausente. Eu olhei para a resolução, a entrada é 960 x 720 e a saída é 320 x 240, mas não diminui o tamanho do vídeo inteiro; em vez disso, corta uma seção de 320 x 240 no canto superior esquerdo e mostra que, no vídeo de saída, o restante os vídeos de entrada estão ausentes. Existe uma adição à sua linha de comando que evite isso?
Mugba

Ah, entendi, você também deve escalar a cor preta para a resolução que deseja obter. Veja a resposta atualizada. Eu adicionei escala para filtrar o gráfico.
ptQa

Isso resolveu, obrigado. Fiz upload de um vídeo de exemplo mostrando o crossfading caso alguém quer vê-lo em ação, youtu.be/JqorgXAjjTo
Mugba

Mesmo problema; Eu tenho uma variante deste trabalho em alguns dos meus próprios vídeos - obrigado. Pergunta: Como isso seria modificado para diminuir o desbotamento das faixas de áudio dos vídeos, seguindo o mesmo padrão do desbotamento do vídeo?
Jim Miller

1
BTW, acho que há um erro no comando de amostra da resposta - deve ser -i 1.mp4 -i 2.mp4..., certo?
Jim Miller

7

Foi assim que eu fiz:

  • versão ffmpeg N-77197-gdf2ce13
  • 2 vídeos de 4 segundos cada.
  • Precisa juntá-lo com desvanecer-se entre eles.
  • vídeos são 25 qps.

1) Adicione o desbotamento (claro ao escuro) no final do 1º e o desbotamento (escuro ao claro) no início do 2º:

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 desbotamento iniciará o quadro 76 e terminará 24 quadros mais tarde = 1s desaparecer.

0:25 significa que o fade in começará o quadro 0 e terminará 25 quadros depois.

2) Mesclar os 2 vídeos

Converter 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

Graças a:

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


6
Isso não é um crossfade.
Gyan

4
O que @Mulvya disse. Um crossfade desbota um clipe ao mesmo tempo que outro desbota. O primeiro clipe tem sua transparência constantemente aumentada ao longo da duração do crossfade; o segundo tem sua transparência constantemente diminuída.
intuited

7

O ffmpeg-concat é a maneira mais fácil de realizar o que você deseja e permite que você use várias transições OpenGL sensuais, com o padrão sendo crossfade.

O ffmpeg-gl-transição é um filtro ffmpeg personalizado que permite usar o GLSL para fazer a transição suave entre dois fluxos de vídeo. Esse 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

4
Você já pensou em enviar um patch para o FFmpeg?
Llogan

1
Definitivamente vou, só preciso corrigir alguns pequenos problemas e testar mais primeiro. Boa decisão!
fisch2

isso está no FFmpeg oficial? Não consigo localizá-lo
kraftydevil
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.