8 表達式計算/求值
在計算表達式時,ffmpeg通過libavutil/eval.h
接口調用內部計算器進行計算。
表達式可以包含一元運算符、運算符、常數和函數
兩個表達式expr1
和expr2
可以組合起來成為"expr1;expr2" ,兩個表達式都會被計算,但是新表達式(組合起來的)值實為表達式expr2
的值。
表達式支持的二元運算符有:+
,-
,*
,/
,^
一元運算符:+
,-
以及下面的函數:
-
abs(x)
返回x的絕對值.
-
acos(x)
計算x反余弦 .
-
asin(x)
計算x的反正弦.
-
atan(x)
計算x反正切.
-
between(x, min, max)
判斷min<=x<=max是否成立,成立返回1,否則返回0.
-
bitand(x, y)
-
bitor(x, y)
返回x和y按位與/或的值
注意計算是作為整數的,轉換為整數和轉換回浮點數都會損傷精度。這可能造成意外結果(通常2^53和更大的數)
-
ceil(expr)
返回大于expr的最接近整數,例如"ceil(1.5)" 返回"2.0".
-
clip(x, min, max)
Return the value of x clipped between min and max.
-
cos(x)
計算x的余弦.
-
cosh(x)
計算x的雙余弦.
-
eq(x, y)
如果x==y返回1,否則為0 otherwise.
-
exp(x)
計算指數x,(底數為e,即計算歐拉數(Euler’s number))
-
floor(expr)
返回不大于expr的整數,例如 "floor(-1.5)" 為 "-2.0".
-
gauss(x)
計算x的高斯(Gauss )函數值,即計算(-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的斜邊長度(勾股定理)
-
if(x, y)
判斷x值,如果x值為非0,則返回y,否則返回0
-
if(x, y, z)
判斷x值,如果x值為非0,則返回y,否則返回z.
-
ifnot(x, y)
判斷x值,如果x值為0,則返回y,否則返回0
-
ifnot(x, y, z)
判斷x值,如果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
-
pow(x, y)
計算"(x)^(y)".
-
print(t)
-
print(t, l)
以日志層次l打印t,如果l沒有定義則采用當前默認日志層次,返回打印內容。
-
random(x)
返回一個0.0-1.0間的隨機數,x是一個隨機數種子。
-
root(expr, max)
對于不同的輸入計算表達式expr的值,直到max輸入值。即依次取ld(x),x的值為0..max,把ld(x)值作為參數計算expr值
表達式expr必須是一個連續函數,否則結果不定。
ld(0)被用作expr表達式的參數,所以表達式可以依據不同的值計算多次。
-
sin(x)
計算x的正弦
-
sinh(x)
計算x的雙曲正弦
-
sqrt(expr)
計算x的平方根。相當于 "(expr)^.5".
-
squish(x)
計算 1/(1 + exp(4*x)).
-
st(var, expr)
對var變量在內部存儲一個expr值,供以后使用,var范圍為0-9.注意這些變量當前不能在表達式間共享
-
tan(x)
返回x的正切.
-
tanh(x)
計算x的雙曲正切
-
taylor(expr, x)
-
taylor(expr, x, id)
計算泰勒(Taylor)級數值。給出表達式(ld(id))在0階的導數函數,即taylor(expr,x)=taylor(expr,x,0)
如果級數不收斂,則結果是不確定的。
ld(id)用來表示expr的導數階,這意味著對給定的表達式,輸入不同的值可以通過ld(id)進行多次計算。這里我們假定不是預設的0階。
注意當你用一個Y值替代默認的0時,相當于計算 taylor(expr, x-y)
-
time(0)
返回當前時間,單位為秒
-
trunc(expr)
返回expr最接近的(向0)整數,如"trunc(-1.5)" 值為 "-1.0".
-
while(cond, expr)
當cond不為0時循環執行expr,直至cond為0
有如下一些常量:
-
PI
單位圓周長與直徑比,約3.14
-
E
exp(1)計算值 (Euler’s 歐拉數),約2.718
-
PHI
黃金分割比,(1+sqrt(5))/2計算值,約1.618
以及布爾運算,其中非0值表示"true"(真),以及運算符:
-
*
表示AND
與操作 -
+
表示OR
或操作
例如:
要表示 if (A AND B) then C
等效于if(A*B,C)
如果你了解C語言代碼,其所有的一元和二元以及定義的常數均可用于表達式。
表達式也支持國際標準的單位前/后綴(定義),例如i
附加在數值后,表示這個數值是基于1024而不是1000計算冪的,"B"表示"Byte",并可以附加一個單位前綴或者當地使用,例如允許KB
,MiB
,G
和B
作為單位后綴。
下面的列表就是當前遵循的國際體系前綴列表,并給出了對應2的整10次方值:
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