在下面的代码中,我为每个图像添加了各种过滤器。
drawbox
为了说明这个问题,我从中删除了过滤器[2:v]
。
以下是来自以下代码的视频:http://128.199.50.223/videos/super_user_test_10_temp.mp4
您会注意到,第一个过渡在下一个图像淡入之前会切换为黑色。然后第二个过渡(从图像 2 到图像 3)交叉淡入淡出。但是,如果我将滤镜drawbox
重新添加到其中[2:v]
,它将切换为黑色并像第一个一样淡入第二个过渡。
因此,我的问题分为两部分:
- 为什么绘制框会破坏交叉淡入淡出并导致在淡入之前切换为黑色?
- 如何才能获得文本后面的半透明框,同时保持在第二次转换中看到的交叉淡入淡出效果?
代码如下:
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 月修复。