Questão concatenando com crossfade vários vídeos (com áudio)


Eu tenho 7 videoclipes curtos que são todos do mesmo tamanho, taxa de quadros, etc. Eu quero concatená-los um após o outro com crossfade de 2 segundos, e não perder áudio. Extraído de um post anterior aqui, tentei apenas concatenar / crossfading os dois primeiros usando:

ffmpeg -i *clip1.mp4 -i *clip2.mp4  \
-filter_complex "[0]fade=t=out:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va0]; \
[1]fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va1];  \
[va0][va1]overlay[outv];[0][1]amix[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4

No entanto, isso produz um vídeo que imediatamente desvanece o primeiro vídeo e termina exatamente no mesmo comprimento que o segundo vídeo (que é de 40 segundos). Eu suponho que isso é por causa de "st = 0" para o primeiro vídeo [0]? No entanto, se eu mudar isso para "st = 18" (o primeiro vídeo tem 20 segundos), o vídeo combinado resultante (out.mp4) ainda terá o primeiro vídeo desaparecendo imediatamente (e todo o vídeo ainda tem apenas 40 segundos) de 58). No entanto, o áudio do primeiro agora dura 18 segundos (mas agora está sobrepondo o segundo vídeo e seu áudio por 18 segundos). Alguma sugestão do que tentar?


1


origem




Respostas:


Para ingressar com clipes com crossfades - você precisa cuidar de duas coisas - aplicar o fade no momento correto e do tipo correto, e atrasar os timestamps de vídeo para que cada vídeo comece no momento correto dentro da montagem final.

Nesse caso, seu primeiro vídeo é de 20s, seu segundo vídeo é de 40s e você deseja um crossfade de 2s. Ao executar crossfades usando o filtro de sobreposição, só precisamos aplicar fade-ins para o vídeo de entrada. Aplicar um fade-out ao vídeo de saída produzirá um mergulho de luminância - às vezes desejável, mas evito-o.

Então, primeiro, aplicamos um fade 2s dentro no início do segundo vídeo.

[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1];

Como o fade é aplicado apenas ao canal alfa, o vídeo precisa ter um canal alfa. Normalmente, os vídeos não, portanto, um filtro de conversão de formato de pixel é aplicado antes do desvanecimento para alterar o formato de pixel do segundo vídeo para um que tenha alfa - anote o a dentro yuva444p. Um desvanecimento do tipo in é aplicado a partir do horário 0 e de duração 2s ao canal alfa apenas isto é, os pixels coloridos do vídeo não são afetados.

Agora o segundo vídeo deve ser atrasado. Como o primeiro vídeo tem 20 segundos de duração e um crossfade 2s é desejado, o segundo vídeo deve começar aos 18 anos dentro da montagem. Então o filtro setpts é aplicado

setpts=PTS-STARTPTS+18/TB

A TB refere-se ao base de tempoe é a unidade na qual os registros de data e hora são armazenados para um fluxo.

Para crossfades de áudio, há um filtro de passagem direta

[0][1]acrossfade=d=2

Isso define um crossfade de 2 segundos.

Agora podemos montar os dois clipes

ffmpeg -i *clip1.mp4 -i *clip2.mp4  \
-filter_complex \
 "[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1];  \
 [0][va1]overlay[outv];[0][1]acrossfade=d=2[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4

1



Obrigado! Isso funciona lindamente. Eu pareço estar preso tentando ficar 3 amarrado juntos. Eu tentei: ffmpeg -i * clip1.mp4 -i * clip2.mp4 -i * clip3.mp4 -filter_complex "[1] formato = yuva444p, fade = t = em: st = 0: d = 2: alfa = 1, setpts = PTS-STARTPTS + 18 / TB [va1]; [2] formato = yuva444p, fade = t = in: st = 0: d = 2: alfa = 1, setpoints = PTS-STARTPTS + 58 / TB [va2] ; [0] [va1] overlay [outv]; [va1] [va2] sobreposição [outv]; [0] [1] acrossfade = d = 2 [outa]; [1] [2] acrossfade = d = 2 [ outa] "-map [outv] -map" [outa] "-crf 10 out7.mp4 Mas tenho" índice de arquivo inválido 2 na descrição do filtergraph ... " - pts2
A segunda sobreposição tem que usar a saída da 1ª sobreposição como sua base. O mesmo vale para o acrossfade, ou seja [outv][va2]overlay[outv] e [outa][2]acrossfade=d=2[outa] - Gyan
que funcionou para a parte de vídeo, mas o áudio (para o terceiro clipe) estava fora de sintonia. Acabei de usar repetidamente o código que você forneceu para 2 vídeos (por exemplo, clip1 + clip2, clip3 + clip4, depois [clip1 + clip2] + [clip3 + clip4], etc., até que todos os 7 foram inscritos. Muito obrigado por sua ajuda e a grande explicação. - pts2
Além disso, o ponto menor: seu código para dois clipes precisa de uma aspa inicial após -filter_complex (para corresponder ao que está nas extremidades do código filter_complex) - pts2