《FFmpeg Basics》中文版-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 |
* | 双目 | 提供乘法运算 | 4*5=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)的音调,我们可以使用命令(命令里面右括号,我这儿会报语法错误)
ffplay -f lavfi -i aevalsrc=sin(523.251*2*PI*t)
我的测试命令:
ffplay -f lavfi -i aevalsrc=sin\(523.251*2*PI*t\)
由于余弦函数具有相似的周期性,下一个命令给出了相同的结果:
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秒:
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)
在书中使用函数的其他例子: