Eu tenho um comando FFmpeg em um script que faz o crossfade de um vídeo principal com um outro e, em seguida, sobrepõe uma marca d'água PNG semitransparente em cima dele.
ffmpeg -y -i "$1" -i "outro.mp4" -i "../Watermark/watermark3.png" \
-filter_complex \
"color=black:$res:d=$total[base]; \
[0:v]scale=-2:'max(720,ih)',setpts=PTS-STARTPTS[v0]; \
[1:v]format=yuva420p,fade=in:st=0:d=$fadeduration:alpha=1,setpts=PTS-STARTPTS+(($fadetime)/TB)[v1]; \
[2:v]lut=a=val*0.7[v2]; \
[v2][v0]scale2ref=w=oh*mdar:h=ih*0.1[wm_scaled][vidtmp1]; \
[base][vidtmp1]overlay[tmp]; \
[tmp][v1]overlay,format=yuv420p[tmp2]; \
[tmp2][wm_scaled]overlay=W-w-50:50:format=auto,format=yuva420p[outv]" \
-map "[outv]" -map 0:a:0 -c:v libx264 -crf 17 -c:a copy "$output"
Isso funciona bem o suficiente, mas quero que a sobreposição a) seja exibida apenas no vídeo principal eb) apareça e desapareça.
No entanto, tentando adicionar os fade
filtros necessários à marca d'água:
[2:v]lut=a=val*0.7,fade=in:st=5:d=2:alpha=1,fade=out:st=150:d=2:alpha=1[v2];
... simplesmente falha silenciosamente, produzindo uma saída de trabalho sem marca d'água para ser vista.
O que está acontecendo aqui?
Acontece que o motivo desse problema irritante e - para mim - de longa data foi causado pelo PNG tecnicamente não ter quadros: porque não tem quadros, não tem nada para animar e, portanto, nada para aparecer ou desaparecer.
É irritante que não haja verificação de erros para isso e que a sobreposição seja simplesmente retirada do fluxo, mas em ambos os casos, uma vez que você sabe qual é o problema, é resolvido simplesmente adicionando uma
-loop
opção diretamente antes do caminho para a imagem:Você também pode precisar adicionar a
shortest=1
opção aooverlay
filtro ao aplicar a sobreposição, para garantir que a sobreposição pare com o final do vídeo em vez de continuar em loop indefinidamente: