当计算一个算术表达式时,FFmpeg使用内部公式求值器,在libavutil/eval.h
中实现的接口。
表达式可能包含一元
、二进制运算符
、常量
和函数
。
两个表达式expr1
和expr2
可以组合在一起形成另一个表达式expr1;expr2
。 对expr1
和expr2
进行了相应的评估,新表达式求值为expr2
的值。
下面的二进制操作符是可用的
- +
- -
- *
- /
- ^.
以下的一元运算符是可用的:
- +
- -
下面的函数是可用的:
abs(x)
计算 x 的绝对值.acos(x)
计算 x 的反余弦.asin(x)
计算 x 的反正弦.atan(x)
计算 x 的反正切.atan2(x, y)
计算 y/x 反正切的主值.between(x, min, max)
如果 x 大于或等于 min 并且小于或等于 max 返回 1, 否则返回 0bitand(x, y)
bitor(x, y)
- 对 x 和 y 按位与/或计算. 在做按位计算之前,需要确保 x 和 y 是整数 注意: 对整数的转换和转换回浮点数的转换可能会失去精度。要当心大数字的意外结果 (通常是 2^53 并且更大).
ceil(expr)
四舍五入 expr 到最近的比原值大的整数值, 例如: "ceil(1.5)" 的值是 "2.0".clip(x, min, max)
返回 min 最小值和 max 最大值之间的值cos(x)
计算 x 的余弦.cosh(x)
计算 x 的双曲余弦eq(x, y)
如果 x 和 y 相等返回 1, 否则返回 0.exp(x)
计算 x 的指数(以e为底的欧拉数).floor(expr)
将表达式的值四舍五入到最近的比原值小的整数,例如: "floor(-1.5)" 是 "-2.0".gauss(x)
计算 x 的高斯函数, 与 exp(-xx/2) / sqrt(2PI) 一致.gcd(x, y)
返回 x 和 y 的最大公约数. 如果 x 和 y 是 0 或者都小于 0 则未定义.gt(x, y)
如果 x 大于 y 返回 1, 否则返回 0.gte(x, y)
如果 x 大于或者等于 y 返回 1, 否则返回 0.hypot(x, y)
这个函数和 C 语言的函数名称相同; 返回的是 "sqrt(xx + yy)", 也就是直角三角形斜边的长度, x 和 y 是两个直角边或者原点到 x 和到 y 的举例.if(x, y)
判断 x, 如果不是 0 就返回 y 判断的值,否则返回 0.if(x, y, z)
判断 x, 如果不是 0 就返回 y 判断的值,否则返回 z 判断的值ifnot(x, y)
判断 x, 如果是 0 就返回 y 判断的值,否则返回 0.ifnot(x, y, z)
判断 x, 如果是 0 就返回 y 判断的值,否则返回 z 判断的值isinf(x)
如果 x 是 +/-无穷大返回 1.0,否则返回0.0.isnan(x)
如果 x 是 NAN 返回 1.0,否则返回 0.0.ld(var)
加载内部变量 var 的值,这个变量存储在st(var, expr). 函数返回加载的值.log(x)
计算 x 的自然对数.lt(x, y)
如果 x 小于 y 则返回 1, 否则返回 0.lte(x, y)
如果 x 小于或者等于 y 则返回 1, 否则返回 0.max(x, y)
返回 x 和 y 的最大值min(x, y)
返回 x 和 y 的最小值mod(x, y)
计算 x 除以 y 的余数not(expr)
如果 expr 是 0 返回 1.0, 否则返回 0.0.pow(x, y)
计算 x 的 y 次幂,相当于 "(x)^(y)".print(t)
print(t, l)
打印 loglevel 是 l 的表达式 t. 如果 l 没有值就使用默认的 loglevel. 返回表达式打印出来的内容.
打印 l 级别的 t
random(x)
在 0.0 和 1.0 之间返回一个伪随机值. x 是内部变量的索引它将被用来保存 seed/state.root(expr, max)
找一个输入的值 ld(0) 是在间隔 0..max 里面的 0;- expr 中的表达式必须表示一个连续函数,否则结果是未定义的.
- ld(0) 用于表示函数输入值, 这意味着给定的表达式将被多次求值, 并且表达式可以通过 ld(0) 来访问该表达式. 当表达式求值为 0 时,将返回相应的输入值.
round(expr)
将表达式的值四舍五入到最近的整数. 例如: round(1.5)" 是 "2.0".sin(x)
计算 x 的正弦.sinh(x)
计算 x 的双曲正弦.sqrt(expr)
计算 expr 的平方根. 这相当于 "(expr)^.5".squish(x)
计算表达式 1/(1 + exp(4*x)).st(var, expr)
将表达式 expr 的值存储在一个内部变量中. var 指定了存储该值的变量的数量, 它的值从 0 到 9. 函数返回存储在内部变量中的值. 注意: 变量当前不是在表达式之间共享的.tan(x)
计算 x 的正切.tanh(x)
计算 x 的双曲正切.taylor(expr, x)
taylor(expr, x, id)
- 求 x 的泰勒级数, 给出一个表示函数在 0 处的导数的表达式 ls(id)。
- 当级数不收敛时,结果未定义.
- ld(id) 用于表示 expr 中的派生顺序,这意味着给定的表达式将多次使用表达式可以通过 ld(id) 访问的各种输入值进行计算. 如果没有指定 id 则假定为0.
- 注意: 当你用 y 而不是 0 时, 可以用 taylor(expr, x-y). *
time(0)
返回当前时间 (Wallclock) 秒为单位.trunc(expr)
将表达式 expr 的值四舍五入为 0 到最近的整数, 例如: "trunc(-1.5)" 是 "-1.0".while(cond, expr)
当表达式 cond 非 0 时求表达式 expr 的值,并且返回表达式 expr 的值, 如果 cond 的结果一直是 false 的话,就返回NAN.
下边这些常量是可用的:
PI
圆周率派. 3.14E
自然对数的底数, 是一个无理数, 约等于2.718PHI
黄金比例 (1+sqrt(5))/2, 约等于 1.618
案例
跑马灯效果(滚动字幕)
从左往右滚
ffmpeg -i input.mp4 -vf "drawtext=text=hello :expansion=normal:fontfile=foo.ttf: y=h-line_h-10:x=(mod(5*n\,w+tw)-tw): fontcolor=white: fontsize=40: shadowx=2: shadowy=2" output.mp4
从右往左滚
The scroll will start at t
= 4.5s
and a character will scroll across the width in 5.5
seconds.
ffmpeg -i input.mp4 -vf "drawtext=text=string1:fontfile=foo.ttf:y=h-line_h-10:x=w-(t-4.5)*w/5.5:fontcolor=white:fontsize=40:shadowx=2:shadowy=2"
This one loops.
-vf "drawtext=text='abcd':fontfile=bpmono.ttf:y=h-line_h-10:x=w-mod(max(t-4.5\,0)*(w+tw)/5.5\,(w+tw)):fontcolor=ffcc00:fontsize=40:shadowx=2:shadowy=2"
从右往左滚,单次滚动时长10秒,间隔30秒滚一次
ffmpeg -i input.mp4 -filter:v drawtext="fontfile=Microsoft YaHei Mono.ttf:text='Hello World':fontcolor=white@1.0:fontsize=36:y=h-line_h-10:x=w-tw-w/10*mod(t\,30):enable=gt(mod(t\,20)\,10)" -codec:v libx264 -codec:a copy -y output.mp4
问题
drawtext 随机字幕 不生效 t 参数 换 n ,具体是什么原因 没有查明确
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=if(eq(mod(t\,30)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(t\,30)\,0)\,rand(0\,(h-text_h))\,y)"
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=if(eq(mod(n\,30)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(n\,30)\,0)\,rand(0\,(h-text_h))\,y)"
发表评论 取消回复