FFmpeg使用drawtext滤镜时新绘制文字覆盖旧内容如何解决
问题原因
- 核心问题出在
drawtext滤镜的enable参数生效区间设置错误:你为第一个字母设置的生效范围仅为011秒、第二个为1122秒、第三个为22~33秒。超过对应区间后,该条drawtext就不会再向画面绘制内容,因此后续时间段仅会渲染当前生效的单条字母,看起来就是后面的字母覆盖了前面的内容,和[in][out]标记无关。
解决思路
方案1:调整enable生效区间(适配现有写法)
将每个字母的enable结束时间统一设置为总时长(此处为33秒),保证字母从出现时间点开始就一直保留在画面上,修改后的命令如下:
ffmpeg.exe -i ffmpeg_inputs/zheltiy_chelik.mp4 -vf "[in]drawtext=fonts/Temporarium.otf:text='r':fontcolor=orange:fontsize=100:x=(w-text_w)/2+0:y=0:enable='between(t,0, 33)', drawtext=fonts/Temporarium.otf:text='r':fontcolor=orange:fontsize=100:x=(w-text_w)/2+20:y=0:enable='between(t,11, 33)', drawtext=fonts/Temporarium.otf:text='r':fontcolor=orange:fontsize=100:x=(w-text_w)/2+40:y=0:enable='between(t,22, 33)'[out]" ffmpeg_outputs/test2.mp4 -y
方案2:动态文本表达式写法(适配长单词更简洁)
如果要拼接的单词较长,可以通过单条drawtext配合时间表达式动态输出文本,不需要重复写多条滤镜,也无需手动计算每个字母的偏移量:
ffmpeg.exe -i ffmpeg_inputs/zheltiy_chelik.mp4 -vf "drawtext=fontfile=fonts/Temporarium.otf:text='%{if:gte(t,0):r}%{if:gte(t,11):r}%{if:gte(t,22):r}':fontcolor=orange:fontsize=100:x=(w-text_w)/2:y=0" ffmpeg_outputs/test2.mp4 -y
内容的提问来源于stack exchange,提问作者Maksym Shuldiner
相关产品推荐
相关产品推荐

