当计算一个算术表达式时,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, 否则返回 0
‘bitand(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(-x*x/2) / sqrt(2*PI) 一致.
‘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(x*x + y*y)", 也就是直角三角形斜边的长度, 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.14
‘E’
自然对数的底数, 是一个无理数, 约等于2.718
‘PHI’
黄金比例 (1+sqrt(5))/2, 约等于 1.618
下面随便举一个显示logo的例子:
在bbs里面看到一个问题:
他问的这个问题其实很好理解,就是希望在某一个时间段内插入一个logo,那么考虑到是一个时间段内,可以理解为between能够达到要求,那么就是enable=between(x, min, max); 而x是时间变量,也就是't',接下来就可以拼一个命令行:
ffmpeg -f lavfi -i testsrc2=s=640x480 -i ~/onvideo/8-4号logo全家桶/新logo.png -filter_complex "[1:v]scale=200:-1[o1];[0:v][o1]overlay=x=20:y=20:enable='between(t,3,5)'" -b:v 5M -r:v 25 -vcodec libx264 output.ts
命令行执行后显示logo是在3-5秒钟的时候出现logo,看一下效果
效果还可以。