13.数学函数

FFmpeg工具提供的一个巨大优势是内置的数学函数,可以对某些音频和视频过滤器、选项和源进行各种修改。

可以使用数学函数的表达式

许多FFmpeg选项都需要数值作为参数,其中一些可以是表达式形式,可以包含算术运算符、常量和各种数学函数。函数通常用于音频和视频过滤器和源,下一个表包含它们的列表,包括在哪里找到它们的描述。

FFmpeg中的算术表达式的评估提供了一个内部公式评估器,通过位于文件libavutil/eval.h中的接口实现。这个评估人员也接受国际系统编号前缀(在FFmpeg文档中被称为后缀,因为它们是在数字之后立即输入的)。如果我是在前缀后面加上,使用的是2的幂而不是10的幂。B(字节)前缀将值乘以8,并且可以在另一个前缀后附加或单独使用。这意味着,例如B, KB, MiB可以像前缀一样使用。可用的SI数字前缀的列表在FFmpeg基础上。C代码中的开发人员可以扩展一元函数和二进制函数的列表,并定义额外的常量,这些常量将在描述的表达式中可用。

名称 类型 具体描述的章节
aevalsrc 音频源 数字音频章节
asettb 音频过滤器 高级技术章节
aspect option 词汇表章节
astreamsync 音频过滤器 数字音频章节
boxblur 视频过滤器 模糊,锐化和其他去噪章节
crop 视频过滤器 裁剪视频章节
drawtext 视频过滤器 为视频添加文字章节
hue 视频过滤器 颜色修正章节
lut, lutrgb, lutyuv 视频过滤器 颜色修正章节
overlay 视频过滤器 overlay-画中画章节
rc_eq option 格式之间转换章节
pad 视频过滤器 填充视频章节
scale 视频过滤器 调整和伸缩视频章节
select 视频过滤器 高级技术章节
setdar, setsar 视频过滤器 高级技术章节
setpts 视频过滤器 时间操作章节
settb 视频过滤器 高级技术章节
volume 音频过滤器 数字音频章节

内置算术运算符

FFmpeg工具的用户可以使用常用的单目和双目算术运算符,如下表所述。

操作符 类型 描述 例子
+ 单目 将负值转换为正数 +(-3)=3
- 单目 将正数转换为负数 -(2+3)=-5
+ 双目 提供加法操作 4+5=9
- 双目 提供减法运算 10-6=4
双目 提供乘法运算 45=20
/ 双目 提供除法运算 9/3=3
^ 双目 提供了一个指数函数 10^2=10*10=100

内置的常量

最近FFmpeg仅包含下表中描述的3个常量,但开发人员可以通过修改源代码来定义附加常量。

符号 数值 描述
PI 3.14159265358979323846 圆周率
E 2.7182818284590452354 自然对数的底数,欧拉数
PHI 1.61803398874989484820 黄金比例,(1 +√6(5)/ 2

PI常数通常用作三角函数的正弦,余弦,正切等参数。例如,要产生频率为523.251 Hz的C5音调(中音高C)的音调,我们可以使用命令(命令里面右括号,我这儿会报语法错误)

  1. ffplay -f lavfi -i aevalsrc=sin(523.251*2*PI*t)

我的测试命令:

  1. ffplay -f lavfi -i aevalsrc=sin\(523.251*2*PI*t\)

由于余弦函数具有相似的周期性,下一个命令给出了相同的结果:

  1. ffplay -f lavfi -i aevalsrc=cos(523.251*2*PI*t)

内置数学函数表

如果我们使用2个不同的表达式,并希望将它们组合成另一个表达式,我们可以使用一个符号“expr1;expr2”,其中expr1和expr2依次被计算,新的表达式求出expr2的值。

当使用函数来评估表达式为“true”时,如果它们具有非零值,我们可以利用*符号(星号)的工作方式类似于逻辑,并且+符号(+)的工作方式类似或。接下来的两页包含FFmpeg工具中可用函数的表。

可用的函数表达式

函数 描述
abs(x) 计算x的绝对值
acos(x) x的反余弦计算
asin(x) 计算x的反正弦
atan(x) 计算x的反正切
ceil(expr) 将expr扩展到最近的整数,例如ceil(4.5)=5.0
cos(x) 计算cos(x)
cosh(x) 计算双曲余弦x
eq(x, y) 如果x=y,则返回1,否则返回0
exp(x) 以e=2.71828182(欧拉数)计算x的指数
floor(expr) 85/5000
将expr扩展到最近的整数,例如地板(4.5)=4,地板(-4.5)=-5
gauss(x) 计算x的高斯函数,对应exp(-xx/2) / sqrt(2PI)
gcd(x, y) 计算x和y的最大公约数,如果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(不是数字),则返回0
ld(var) 使用var标识符返回一个由st(var, expr)函数设置的内部变量值
log(x) 用e=2.71828182(欧拉数)计算x的自然对数
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的余数
not(expr) 如果expr为0,则返回1,否则返回1
pow(x, y) 计算x的值提高到y的力量,结果是相当于(x)^(y)
random(x) 从0.0 - 1.0返回一个伪随机数,x是用于保存种子/状态的内部变量的索引
root(expr, max) 在区间0中找到f(x)=0的地方。函数f()必须是连续的,否则结果是未定义的
sin(x) 计算sin(x)
sinh(x) 计算双曲正弦函数
sqrt(expr) 计算√expr,结果是相当于(expr)^ 0.5
squish(x) 计算表达式1/(1 + exp(4*x))
st(var, expr) 将表达式expr的值存储到带有数字var(值0到9)的内部变量中,变量目前不在表达式之间共享
tan(x) 计算tanx
tanh(x) 计算双曲正切x
taylor(expr, x) taylor(expr, x, id) -求x的泰勒级数,expr表示f(x)在0处的导数 -如果id没有指定,则假定为0 -如果你有y的导数而不是0,可以用taloy(expr, x-y) -如果级数不收敛,结果是未定义的
trunc(expr) 向0到最近的整数,例如地板(-4.5)=-4
while(cond, expr) 计算表达式expr时,表达式cond为非零,并返回最后一个expr评价的值,或者NAN if cond总是false
-rc_eq选项的特殊函数
bits2qp(bits) qp2bits(qp) 附加功能,可与其他函数一起使用,以定义由所选编解码器的-rc_eq选项指定的速率控制方程

使用函数的例子

函数的大量应用程序提供了drawtext过滤器。例如,可以使用lt(x, y)和gt(x, y)函数来设置文本出现或从视频帧中消失的时间,下一个命令在开始时将文本延迟5秒:

  1. ffplay -f lavfi -i color=c=orange -vf ^ drawtext=fontfile=/Windows/Fonts/arial.ttf:fontcolor=white:fontsize=20:^ text=&##34;5 seconds delayed text&##34;:x=(w-tw)/2:y=(h-th)/2:draw=gt(t\,5)

在书中使用函数的其他例子: