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

1

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?

    
por pts2 21.08.2018 / 06:46

1 resposta

1

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.

Primeiramente, aplicamos um fade 2s em 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 fade para alterar o formato de pixel do segundo vídeo para um que tenha alfa - anote o a in yuva444p . Um desvanecimento do tipo in é aplicado a partir do momento 0 e da duração 2s ao canal alfa apenas ou seja, 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

O TB se refere à base de tempo e é a unidade na qual os registros de data e hora são armazenados para um fluxo.

Para crossfades de áudio, há um filtro de entrada rápida

[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
    
por 21.08.2018 / 08:10