我正在尝试让文本淡入淡出。我希望能够通过字体颜色和表达式来实现 - 就像这样
fontcolor='if(gt(n,44), [email protected], white)'
显然,这不会“淡入”,但只是测试它是否可以评估表达式,并且似乎字体颜色无法处理表达式。这是一个事实陈述 - 字体颜色无法处理表达式?
有人知道除了逐帧链接之外淡入文本的方法吗?有没有办法将文本或类似的东西屏蔽到那种程度?
答案1
遗憾的是,您无法使用表达式作为drawtext
滤镜的文本颜色选项。这使得无法轻松淡入文本或执行任何花哨的操作。
诀窍是使用blend
LordNeckbeard 建议的过滤器,并将包含字幕的流覆盖在原始视频流上。淡入字幕的方法如下:
ffmpeg -y -i input.mp4 -filter_complex "[0:v] drawtext=fontfile=Fonts.ttf:text='test':x=100:y=50:fontcolor=white:fontsize=30 [subtitles]; [subtitles][0:v] blend=all_expr='A*(if(between(T,$start,$end),(T-$start)/($end-$start),1))+B*(1-(if(between(T,$start,$end),(T-$start)/($end-$start),1)))' [out]" -map '[out]' -map 0:a output.mp4
这里,$start
和$end
分别是淡入的开始和结束位置(以秒为单位)。音频流将从输入中获取。您可以使用 将其复制过来-c:a copy
。
答案2
ffmpeg 现在有参数fontcolor_expr
(见ffmpeg 文档),您可以在其中使用表达式。