FFmpeg 为什么 drawbox 过滤器会破坏交叉淡入淡出效果以及我该如何获得所需的结果?

FFmpeg 为什么 drawbox 过滤器会破坏交叉淡入淡出效果以及我该如何获得所需的结果?

在下面的代码中,我为每个图像添加了各种过滤器。

drawbox为了说明这个问题,我从中删除了过滤器[2:v]

以下是来自以下代码的视频:http://128.199.50.223/videos/super_user_test_10_temp.mp4

您会注意到,第一个过渡在下一个图像淡入之前会切换为黑色。然后第二个过渡(从图像 2 到图像 3)交叉淡入淡出。但是,如果我将滤镜drawbox重新添加到其中[2:v],它将切换为黑色并像第一个一样淡入第二个过渡。

因此,我的问题分为两部分:

  1. 为什么绘制框会破坏交叉淡入淡出并导致在淡入之前切换为黑色?
  2. 如何才能获得文本后面的半透明框,同时保持在第二次转换中看到的交叉淡入淡出效果?

代码如下:

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

下面是一个简化版本,仍然显示了这个问题。要测试代码,请输入任何 640x480 图像。您将看到剪切,然后淡入淡出。然后删除过滤器drawbox,您将看到交叉淡入淡出,就像它应该出现的那样。

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

如果您需要更多信息,请告诉我。

谢谢!

答案1

您的命令本身没有问题。 drawtext 过滤器中有一个错误,导致无法在(半)透明表面上绘制文本。好吧,您可以,但是 alpha 平面被重置为不透明。此错误已于 2016 年 9 月修复。

相关内容