concatenando com crossfade vários vídeos (com áudio)

concatenando com crossfade vários vídeos (com áudio)

Tenho 7 videoclipes curtos, todos do mesmo tamanho, taxa de quadros, etc. Quero concatená-los um após o outro com crossfade de 2 segundos e não perder o áudio. Retirado de um post anterior aqui, tentei apenas concatenar/fazer crossfading dos 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 desaparece imediatamente do primeiro vídeo e termina exatamente com a mesma duração do segundo vídeo (que tem 40 segundos). Presumo que isso seja por causa de "st = 0" no primeiro vídeo [0]. No entanto, se eu mudar isso para "st=18" (o primeiro vídeo tem 20 segundos de duração), o vídeo combinado resultante (out.mp4) ainda terá o primeiro vídeo desaparecendo imediatamente (e o vídeo inteiro ainda terá apenas 40 segundos de duração). 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?

Responder1

Para unir clipes com crossfades - você precisa cuidar de duas coisas - aplicar o fade na hora correta e do tipo correto, e atrasar os timestamps do vídeo para que cada vídeo comece no horário correto na montagem final.

Nesse caso, seu primeiro vídeo tem 20 anos, seu segundo vídeo tem 40 anos e você quer um crossfade de 2 segundos. Ao executar crossfades usando o filtro de sobreposição, precisamos apenas aplicar fade-ins ao vídeo recebido. Aplicar um fade-out ao vídeo de saída produzirá uma queda na luminância - às vezes desejável, mas evito isso.

Então, primeiro, aplicamos um fade de 2semno 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 o fazem, portanto, um filtro de conversão de formato de pixel é aplicado antes do fade para alterar o formato de pixel do segundo vídeo para um que tenha nota alfabética aem yuva444p. Um fade de tipo iné aplicado começando no tempo 0e na duração 2saté ocanal alfaapenas ou seja, os pixels coloridos do vídeo não são afetados.

Agora o segundo vídeo deve ser adiado. Como o primeiro vídeo tem 20s de duração e é necessário um crossfade de 2s, o 2º vídeo deve começar aos 18s da montagem. Então o filtro setpts é aplicado

setpts=PTS-STARTPTS+18/TB

A TB refere-se aobase de tempo, e é a unidade na qual os carimbos de data/hora são armazenados para um fluxo.

Para crossfades de áudio, existe um filtro crossfade

[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

informação relacionada