FFmpeg Por que o filtro drawbox está quebrando o crossfade e como posso obter o resultado desejado?

0

No código abaixo, estou adicionando vários filtros a cada imagem.

Para ilustrar o problema, eu removi o filtro drawbox de [2:v] .

Aqui está o vídeo do código abaixo: link

Você notará que a primeira transição é cortada em preto antes que a próxima imagem seja ativada. Em seguida, a segunda transição (da imagem 2 para a imagem 3) se desvanece. No entanto, se eu adicionar o filtro drawbox novamente em [2:v] , ele será cortado em preto e desaparecerá na segunda transição, assim como o primeiro.

Então, minha pergunta tem duas partes:

  1. Por que a caixa de transferência está quebrando o crossfade e fazendo com que um corte fique preto antes do desbotamento?
  2. Como posso colocar a caixa translúcida atrás do texto, mantendo o efeito de crossfade que é visto na segunda transição?

Aqui está o código:

ffmpeg \
-i images/25_test/31630738_0.jpg \
-i images/25_test/31630738_4.jpg \
-i images/25_test/31630738_6.jpg \
-i images/25_test/31630738_8.jpg \
-filter_complex \
"[0:v]format=yuva420p, \
    scale=iw*10:ih*10, \
    zoompan=z='min(zoom+0.0015,1.5)':d=500:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=640x480, \
    drawbox=y=0:[email protected]:width=iw:height=48:t=max, \
    drawtext='fontfile=fonts/OpenSans-Bold.ttf':text='Front':fontcolor=white:fontsize=24:x=20:y=16, \
    fifo \
 [zoom_0]; \
 [1:v]format=yuva420p, \
    scale=iw*10:ih*10, \
    zoompan=z='min(zoom+0.0015,1.5)':d=250:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=640x480, \
    drawbox=y=0:[email protected]:width=iw:height=48:t=max, \
    drawtext='fontfile=fonts/OpenSans-Bold.ttf':text='Kitchen':fontcolor=white:fontsize=24:x=20:y=16, \
    fade=t=in:st=0:d=1:alpha=1, \
    setpts=PTS+5/TB, \
    fifo \
 [zoom_1]; \
 [2:v]format=yuva420p, \
    scale=iw*10:ih*10, \
    zoompan=z='min(zoom+0.0015,1.5)':d=250:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=640x480, \
    drawtext='fontfile=fonts/OpenSans-Bold.ttf':text='Entrance':fontcolor=white:fontsize=24:x=20:y=16, \
    fade=t=in:st=0:d=1:alpha=1, \
    setpts=PTS+10/TB, \
    fifo \
 [zoom_2]; \
 [3:v]format=yuva420p, \
    scale=iw*10:ih*10, \
    zoompan=z='min(zoom+0.0015,1.5)':d=250:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=640x480, \
    drawbox=y=0:[email protected]:width=iw:height=48:t=max, \
    drawtext='fontfile=fonts/OpenSans-Bold.ttf':text='Pool':fontcolor=white:fontsize=24:x=20:y=16, \
    fade=t=in:st=0:d=1:alpha=1, \
    setpts=PTS+15/TB, \
    fifo \
 [zoom_3]; \
 [zoom_0][zoom_1]overlay=0:0:enable='between(t,5,15)'[overlay_0_1]; \
 [overlay_0_1][zoom_2]overlay=0:0:enable='between(t,10,20)'[overlay_1_2]; \
 [overlay_1_2][zoom_3]overlay=0:0:enable='between(t,15,25)' \
" videos/out.mp4

Abaixo está uma versão simplificada que ainda mostra o problema. Para testar o código, insira imagens de 640x480. Você verá o corte e depois desaparecerá. Em seguida, remova os filtros drawbox e você verá o crossfade como deveria aparecer.

ffmpeg \
-loop 1 -t 10 -i images/25_test/31630738_0.jpg \
-loop 1 -t 10 -i images/25_test/31630738_4.jpg \
-filter_complex \
"[0:v]format=yuva420p, \
    drawbox=y=0:[email protected]:width=iw:height=48:t=max \
 [zoom_0]; \
 [1:v]format=yuva420p, \
    drawbox=y=0:[email protected]:width=iw:height=48:t=max, \
    fade=t=in:st=0:d=1:alpha=1, \
    setpts=PTS+5/TB \
 [zoom_1]; \
 [zoom_0][zoom_1]overlay=0:0:enable='between(t,5,15)' \
" out.mp4

Deixe-me saber se você precisar de mais alguma informação.

Obrigado!

    
por Justin Waulters 31.03.2017 / 23:09

1 resposta

1

Seu comando está bem como está. Houve um erro no filtro drawtext devido ao qual não era possível desenhar texto sobre uma superfície (semi) transparente. Bem, você poderia, mas o plano alfa foi redefinido para opaco. Este bug foi corrigido em setembro de 2016.

    
por 03.04.2017 / 08:06