使用ffmpeg的drawtext滤镜制作计时器时如何对%S参数减去5秒?
问题原因
你之前的写法不生效是因为expansion=strftime模式下仅支持标准strftime格式化占位符,占位符外的所有字符都会被直接作为普通文本输出,不支持算术运算,因此你写的减号会直接展示而不会参与计算。
另外原命令中enable参数结尾多了一个多余的单引号,属于语法错误,需要先删除。
解决方法
将expansion改为normal模式,使用drawtext内置的表达式语法计算时间值,就可以实现秒数减5的需求,分两种场景提供方案:
场景1:分钟完全保持原时间的分钟,秒数减5后可显示负数
直接对秒数部分单独做减法即可,修改后的完整ffmpeg命令如下:
ffmpeg -i "before FINAL.mp4" -c:v libx264 -vf drawtext="expansion=normal:fontfile=calibrib.ttf:fontsize=38:enable='between(t,5,10)+between(t,15,20)':text='%{e:floor(t/60):%02d}\:%{e:mod(t,60)-5:%02d}':fontcolor='#414a4c':borderw=2:bordercolor='#414a4c':rate=25:x=334:y=129" -c:a aac "before output.mp4"
场景2:秒数减5后如果小于0,自动从分钟借位(符合正常时间逻辑)
对整体时间做5秒偏移即可,修改后的完整ffmpeg命令如下:
ffmpeg -i "before FINAL.mp4" -c:v libx264 -vf drawtext="expansion=normal:fontfile=calibrib.ttf:fontsize=38:enable='between(t,5,10)+between(t,15,20)':text='%{e:floor((t-5)/60):%02d}\:%{e:mod((t-5),60):%02d}':fontcolor='#414a4c':borderw=2:bordercolor='#414a4c':rate=25:x=334:y=129" -c:a aac "before output.mp4"
Python生成命令注意事项
建议不要手动拼接命令字符串,使用subprocess的列表传参模式,避免引号、转义符相关的错误,参考代码如下:
import subprocess # 此处以场景1的参数为例,可根据需求替换为场景2的text参数 cmd = [ "ffmpeg", "-i", "before FINAL.mp4", "-c:v", "libx264", "-vf", r"drawtext=expansion=normal:fontfile=calibrib.ttf:fontsize=38:enable='between(t,5,10)+between(t,15,20)':text='%{e:floor(t/60):%02d}\:%{e:mod(t,60)-5:%02d}':fontcolor='#414a4c':borderw=2:bordercolor='#414a4c':rate=25:x=334:y=129", "-c:a", "aac", "-y", # 可选:自动覆盖输出文件,无需手动确认 "before output.mp4" ] subprocess.run(cmd, check=True)
内容的提问来源于stack exchange,提问作者U13-Forward
相关产品推荐
相关产品推荐

