FFmpeg drawtext滤镜如何正确求值表达式显示帧号倍数
drawtext滤镜表达式计算的正确写法
报错原因
直接写%{n*50}触发报错,是因为drawtext的文本插值规则中,未加特殊前缀的%{<内容>}结构仅会匹配内置的固定变量名(比如直接引用帧号n、时间戳pts、播放时间t这类预定义变量),不会对括号内的内容做算术运算解析。滤镜会把n*50识别为一个不存在的自定义变量名,因此抛出「not known」错误。
正确语法
如果需要对包含变量的表达式做计算后再显示结果,必须在%{}内的开头添加e:前缀,明确告知滤镜后续内容是需要求值的算术表达式,格式为:%{e:<计算表达式>}
对应需求的可运行命令
ffmpeg -y -r 25 -pattern_type glob -i '*.jpg' -vf "text='%{e:n*50}': start_number=0: x=0: y=0: fontcolor=black: fontsize=30: box=1: boxcolor=white: boxborderw=5" -c:a copy movie.mp4
补充说明
- 该表达式支持FFmpeg滤镜通用的所有算术逻辑,加减乘除、取模、条件判断都可正常写入,例如要显示当前帧对应的毫秒数、帧号奇偶判断结果都可以用该格式实现。
- 如果需要对计算结果做格式化(比如固定位宽补零、指定小数位数),可以在表达式后追加格式化参数,注意不同shell环境下格式化参数前的冒号需要做转义,例如要输出3位宽度、前补零的计算结果,Linux bash环境下写法为
%{e\:n*50\:d}。
内容的提问来源于stack exchange,提问作者Dan Steingart
相关产品推荐
相关产品推荐

