前言
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 |
网友评论