寫在前面
如果您對音視頻技術感興趣,可以訂閱我的專題:音視頻專輯
也可以關注我的簡書賬戶: 張芳濤歧匈,我后期會發(fā)布更多的音視頻以及圖像處理方面的文章崎场。
正文
FFmpeg工具提供的一個巨大優(yōu)勢是內(nèi)置的數(shù)學函數(shù)放仗,可以對某些音頻和視頻過濾器留夜、選項和源進行各種修改。
可以使用數(shù)學函數(shù)的表達式
許多FFmpeg選項都需要數(shù)值作為參數(shù)拧咳,其中一些可以是表達式形式象迎,可以包含算術運算符、常量和各種數(shù)學函數(shù)呛踊。函數(shù)通常用于音頻和視頻過濾器和源砾淌,下一個表包含它們的列表,包括在哪里找到它們的描述谭网。
FFmpeg中的算術表達式的評估提供了一個內(nèi)部公式評估器汪厨,通過位于文件libavutil/eval.h中的接口實現(xiàn)。這個評估人員也接受國際系統(tǒng)編號前綴(在FFmpeg文檔中被稱為后綴愉择,因為它們是在數(shù)字之后立即輸入的)劫乱。如果我是在前綴后面加上,使用的是2的冪而不是10的冪锥涕。B(字節(jié))前綴將值乘以8衷戈,并且可以在另一個前綴后附加或單獨使用。這意味著层坠,例如B, KB, MiB可以像前綴一樣使用殖妇。可用的SI數(shù)字前綴的列表在FFmpeg基礎上破花。C代碼中的開發(fā)人員可以擴展一元函數(shù)和二進制函數(shù)的列表谦趣,并定義額外的常量,這些常量將在描述的表達式中可用座每。
名稱 | 類型 | 具體描述的章節(jié) |
---|---|---|
aevalsrc | 音頻源 | 數(shù)字音頻章節(jié) |
asettb | 音頻過濾器 | 高級技術章節(jié) |
aspect | option | 詞匯表章節(jié) |
astreamsync | 音頻過濾器 | 數(shù)字音頻章節(jié) |
boxblur | 視頻過濾器 | 模糊前鹅,銳化和其他去噪章節(jié) |
crop | 視頻過濾器 | 裁剪視頻章節(jié) |
drawtext | 視頻過濾器 | 為視頻添加文字章節(jié) |
hue | 視頻過濾器 | 顏色修正章節(jié) |
lut, lutrgb, lutyuv | 視頻過濾器 | 顏色修正章節(jié) |
overlay | 視頻過濾器 | overlay-畫中畫章節(jié) |
rc_eq | option | 格式之間轉換章節(jié) |
pad | 視頻過濾器 | 填充視頻章節(jié) |
scale | 視頻過濾器 | 調(diào)整和伸縮視頻章節(jié) |
select | 視頻過濾器 | 高級技術章節(jié) |
setdar, setsar | 視頻過濾器 | 高級技術章節(jié) |
setpts | 視頻過濾器 | 時間操作章節(jié) |
settb | 視頻過濾器 | 高級技術章節(jié) |
volume | 音頻過濾器 | 數(shù)字音頻章節(jié) |
內(nèi)置算術運算符
FFmpeg工具的用戶可以使用常用的單目和雙目算術運算符,如下表所述峭梳。
操作符 | 類型 | 描述 | 例子 |
---|---|---|---|
+ | 單目 | 將負值轉換為正數(shù) | +(-3)=3 |
- | 單目 | 將正數(shù)轉換為負數(shù) | -(2+3)=-5 |
+ | 雙目 | 提供加法操作 | 4+5=9 |
- | 雙目 | 提供減法運算 | 10-6=4 |
* | 雙目 | 提供乘法運算 | 4*5=20 |
/ | 雙目 | 提供除法運算 | 9/3=3 |
^ | 雙目 | 提供了一個指數(shù)函數(shù) | 10^2=10*10=100 |
內(nèi)置的常量
最近FFmpeg僅包含下表中描述的3個常量作喘,但開發(fā)人員可以通過修改源代碼來定義附加常量拭嫁。
符號 | 數(shù)值 | 描述 |
---|---|---|
PI | 3.14159265358979323846 | 圓周率 |
E | 2.7182818284590452354 | 自然對數(shù)的底數(shù)莺治,歐拉數(shù) |
PHI | 1.61803398874989484820 | 黃金比例,(1 +√6(5)/ 2 |
PI常數(shù)通常用作三角函數(shù)的正弦牡拇,余弦,正切等參數(shù)挫以。例如者蠕,要產(chǎn)生頻率為523.251 Hz的C5音調(diào)(中音高C)的音調(diào)窃祝,我們可以使用命令(命令里面右括號掐松,我這兒會報語法錯誤)
ffplay -f lavfi -i aevalsrc=sin(523.251*2*PI*t)
我的測試命令:
ffplay -f lavfi -i aevalsrc=sin\(523.251*2*PI*t\)
由于余弦函數(shù)具有相似的周期性踱侣,下一個命令給出了相同的結果:
ffplay -f lavfi -i aevalsrc=cos(523.251*2*PI*t)
內(nèi)置數(shù)學函數(shù)表
如果我們使用2個不同的表達式,并希望將它們組合成另一個表達式大磺,我們可以使用一個符號“expr1;expr2”抡句,其中expr1和expr2依次被計算,新的表達式求出expr2的值杠愧。
當使用函數(shù)來評估表達式為“true”時待榔,如果它們具有非零值,我們可以利用*符號(星號)的工作方式類似于邏輯流济,并且+符號(+)的工作方式類似或锐锣。接下來的兩頁包含F(xiàn)Fmpeg工具中可用函數(shù)的表。
可用的函數(shù)表達式
函數(shù) | 描述 |
---|---|
abs(x) | 計算x的絕對值 |
acos(x) | x的反余弦計算 |
asin(x) | 計算x的反正弦 |
atan(x) | 計算x的反正切 |
ceil(expr) | 將expr擴展到最近的整數(shù)绳瘟,例如ceil(4.5)=5.0 |
cos(x) | 計算cos(x) |
cosh(x) | 計算雙曲余弦x |
eq(x, y) | 如果x=y雕憔,則返回1,否則返回0 |
exp(x) | 以e=2.71828182(歐拉數(shù))計算x的指數(shù) |
floor(expr) | 85/5000 |
將expr擴展到最近的整數(shù)糖声,例如地板(4.5)=4斤彼,地板(-4.5)=-5 | |
gauss(x) | 計算x的高斯函數(shù),對應exp(-xx/2) / sqrt(2PI) |
gcd(x, y) | 計算x和y的最大公約數(shù)蘸泻,如果x=y=0琉苇,或者如果x<0和y<0,結果是未定義的 |
gt(x, y) | 大于比較悦施,返回1如果x > y并扇,否則返回0 |
gte(x, y) | 大于或等于比較,返回1如果x y抡诞,否則返回0 |
hypot(x, y) | 計算斜邊(直角三角形最長邊)拜马,sqrt(xx + yy) |
if(expr1, expr2) | 評估expr1,如果結果為非零返回expr1的評估沐绒,否則返回0 |
ifnot(exp1, exp2) | 評估exp1俩莽,如果結果為零,則返回值的評估乔遮,否則返回0 |
isinf(x) | 如果x是+/-∞扮超,則返回1.0,否則返回0 |
isnan(x) | 如果x是NaN(不是數(shù)字)蹋肮,則返回0 |
ld(var) | 使用var標識符返回一個由st(var, expr)函數(shù)設置的內(nèi)部變量值 |
log(x) | 用e=2.71828182(歐拉數(shù))計算x的自然對數(shù) |
lt(x, y) | 小于比較出刷,返回1如果x < y,否則返回0 |
lte(x, y) | 小于或等于比較,返回1如果x≤y,否則返回0 |
max(x, y) | 計算x和y的最大值 |
min(x, y) | 計算x和y的最小值 |
mod(x, y) | 計算模坯辩,除法x/y的余數(shù) |
not(expr) | 如果expr為0馁龟,則返回1,否則返回1 |
pow(x, y) | 計算x的值提高到y(tǒng)的力量,結果是相當于(x)^(y) |
random(x) | 從0.0 - 1.0返回一個偽隨機數(shù)漆魔,x是用于保存種子/狀態(tài)的內(nèi)部變量的索引 |
root(expr, max) | 在區(qū)間0中找到f(x)=0的地方坷檩。函數(shù)f()必須是連續(xù)的却音,否則結果是未定義的 |
sin(x) | 計算sin(x) |
sinh(x) | 計算雙曲正弦函數(shù) |
sqrt(expr) | 計算√expr,結果是相當于(expr)^ 0.5 |
squish(x) | 計算表達式1/(1 + exp(4*x)) |
st(var, expr) | 將表達式expr的值存儲到帶有數(shù)字var(值0到9)的內(nèi)部變量中,變量目前不在表達式之間共享 |
tan(x) | 計算tanx |
tanh(x) | 計算雙曲正切x |
taylor(expr, x) taylor(expr, x, id) |
-求x的泰勒級數(shù)矢炼,expr表示f(x)在0處的導數(shù) -如果id沒有指定系瓢,則假定為0 -如果你有y的導數(shù)而不是0,可以用taloy(expr, x-y) -如果級數(shù)不收斂句灌,結果是未定義的 |
trunc(expr) | 向0到最近的整數(shù)夷陋,例如地板(-4.5)=-4 |
while(cond, expr) | 計算表達式expr時,表達式cond為非零胰锌,并返回最后一個expr評價的值骗绕,或者NAN if cond總是false |
-rc_eq選項的特殊函數(shù) | |
bits2qp(bits) qp2bits(qp) |
附加功能,可與其他函數(shù)一起使用资昧,以定義由所選編解碼器的-rc_eq選項指定的速率控制方程 |
使用函數(shù)的例子
函數(shù)的大量應用程序提供了drawtext過濾器爹谭。例如,可以使用lt(x, y)和gt(x, y)函數(shù)來設置文本出現(xiàn)或從視頻幀中消失的時間榛搔,下一個命令在開始時將文本延遲5秒:
ffplay -f lavfi -i color=c=orange -vf ^ drawtext=fontfile=/Windows/Fonts/arial.ttf:fontcolor=white:fontsize=20:^ text="5 seconds delayed text":x=(w-tw)/2:y=(h-th)/2:draw=gt(t\,5)
在書中使用函數(shù)的其他例子: