You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:36:04