前言
Github地址:Github
简书地址:简书
专辑地址:FFplay专辑
5.表达评估
在计算算术表达式时,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的评估结果转换为整数。请注意,转换为整数和转换回浮点都会丢失精度。 注意大数字(通常是 |
‘ceil(expr)’ |
将表达式expr的值向上舍入到最接近的整数。 例如,ceil(1.5)是2.0。 |
‘clip(x, min, max)’ |
返回在min和max之间剪切的x的值。 |
‘cos(x)’ |
计算x的余弦值。 |
‘cosh(x)’ |
计算x的双曲余弦值。 |
‘eq(x, y)’ |
如果x和y相等则返回1,否则返回0。 |
‘exp(x)’ |
计算x的指数(带基数e,欧拉数)。 |
‘floor(expr)’ |
将表达式expr的值向下舍入到最接近的整数。 例如,floor(-1.5)-2.0。 |
‘gauss(x)’ |
计算x的高斯函数,对应于exp(-x * x / 2)/ sqrt(2 * PI)。 |
‘gcd(x, y)’ |
返回x和y的最大公约数。 如果x和y都为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,如果结果为非零,则返回y的求值结果,否则返回0。 |
‘if(x, y, z)’ |
评估x,如果结果为非零,则返回y的评估结果,否则返回z的评估结果。 |
‘ifnot(x, y)’ |
求值x,如果结果为零,则返回y的求值结果,否则返回0。 |
‘ifnot(x, y, z)’ |
评估x,如果结果为零,则返回y的评估结果,否则返回z的评估结果。 |
‘isinf(x)’ |
如果x是+/- INFINITY则返回1.0,否则返回0.0。 |
‘isnan(x)’ |
如果x是NAN则返回1.0,否则返回0.0。 |
‘ld(var)’ |
使用数字var加载内部变量的值,该值先前存储为st(var,expr)。 该函数返回加载的值。 |
‘lerp(x, y, z)’ |
通过z的量返回x和y之间的线性插值。 |
‘log(x)’ |
计算x的自然对数。 |
‘lt(x, y)’ |
如果x小于y则返回1,否则返回0。 |
‘max(x, y)’ |
返回x和y之间的最大值。 |
‘min(x, y)’ |
返回x和y之间的最小值。 |
‘mod(x, y)’ |
计算x除以y的余数。 |
‘not(expr)’ |
如果expr为零则返回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是将用于保存种子/状态的内部变量的索引。 |
‘root(expr, max)’ |
在区间0..max中查找由参数ld(0)表示的函数为0的输入值。expr中的表达式必须表示连续函数或结果未定义。ld(0)用于表示函数输入值,这意味着将使用表达式可以通过ld(0)访问的各种输入值多次计算给定表达式。 当表达式求值为0时,将返回相应的输入值。 |
‘round(expr)’ |
将表达式expr的值舍入为最接近的整数。 例如,round(1.5)是2.0。 |
‘sin(x)’ |
计算x的正弦值。 |
‘sinh(x)’ |
计算x的双曲正弦值。 |
‘sqrt(expr)’ |
计算expr的平方根。 这相当于 |
‘squish(x)’ |
计算表达式 |
‘st(var, expr)’ |
将表达式expr的值存储在内部变量中。 var指定存储值的变量的编号,它是一个介于0到9之间的值。该函数返回存储在内部变量中的值。 注意,变量目前不在表达式之间共享。 |
‘tan(x)’ |
计算x的正切值。 |
‘tanh(x)’ |
计算x的双曲正切。 |
‘taylor(expr, x)’ |
|
‘taylor(expr, x, id)’ |
在给定表示函数的ld(id) -导数为0的表达式的情况下,在x处评估泰勒级数。当系列没有收敛时,结果是不确定的。 ld(id)用于表示expr中的派生顺序,这意味着将使用表达式可以通过ld(id)访问的各种输入值多次计算给定表达式。 如果未指定id,则假定为0。注意,当你的导数在 y而不是0时,可以使用 |
‘time(0)’ |
以秒为单位返回当前(挂钟)时间。 |
‘trunc(expr)’ |
将表达式expr的值向零舍入为最接近的整数。 例如,trunc(-1.5)是-1.0。 |
‘while(cond, expr)’ |
在表达式cond为非零时计算表达式expr,并返回最后一次expr求值的值,如果cond始终为false,则返回NAN。 |
可以使用以下常量:
| 值 | 解释 |
|---|---|
‘PI’ |
单位圆盘的面积,约3.14
|
‘E’ |
2.718
|
‘PHI’ |
黄金比例1.618
|
假设表达式如果具有非零值则被视为true,请注意:
*功能类似于AND。
+功能类似于OR。
示例代码如下:
| 示例代码 |
|---|
if (A AND B) then C |
相当于:
| 示例代码 |
|---|
if(A*B, C) |
在C代码中,可以扩展一元和二元函数的列表,并定义已识别的常量,以便它们可用于表达式。
评估者还识别国际系统单位前缀。 如果在前缀后附加'i',则使用二进制前缀,它基于1024的幂而不是1000的幂.'B'后缀将值乘以8,并且可以在单位前缀后附加或单独使用。 这允许使用例如'KB','MiB','G'和'B'作为数字后缀。
下面是可用的国际系统前缀列表,其中显示相应的10和2的幂。
| 值 | 解释 |
|---|---|
‘y’ |
10^-24 / 2^-80 |
‘z’ |
10^-21 / 2^-70 |
‘a’ |
10^-18 / 2^-60 |
‘f’ |
10^-15 / 2^-50 |
‘p’ |
10^-12 / 2^-40 |
‘n’ |
10^-9 / 2^-30 |
‘u’ |
10^-6 / 2^-20 |
‘m’ |
10^-3 / 2^-10 |
‘c’ |
10^-2 |
‘d’ |
10^-1 |
‘h’ |
10^2 |
‘k’ |
10^3 / 2^10 |
‘K’ |
10^3 / 2^10 |
‘M’ |
10^6 / 2^20 |
‘G’ |
10^9 / 2^30 |
‘T’ |
10^12 / 2^40 |
‘P’ |
10^15 / 2^40 |
‘E’ |
10^18 / 2^50 |
‘Z’ |
10^21 / 2^60 |
‘Y’ |
10^24 / 2^70 |