当计算一个算术表达式时,FFmpeg使用内部公式求值器,在libavutil/eval.h中实现的接口。
表达式可能包含一元二进制运算符常量函数

两个表达式expr1expr2可以组合在一起形成另一个表达式expr1;expr2。 对expr1expr2进行了相应的评估,新表达式求值为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 是整数 注意: 对整数的转换和转换回浮点数的转换可能会失去精度。要当心大数字的意外结果 (通常是 2^53 并且更大).
  • ceil(expr) 四舍五入 expr 到最近的比原值大的整数值, 例如: "ceil(1.5)" 的值是 "2.0".
  • clip(x, min, max) 返回 min 最小值和 max 最大值之间的值
  • cos(x) 计算 x 的余弦.
  • cosh(x) 计算 x 的双曲余弦
  • eq(x, y) 如果 x 和 y 相等返回 1, 否则返回 0.
  • exp(x) 计算 x 的指数(以e为底的欧拉数).
  • floor(expr) 将表达式的值四舍五入到最近的比原值小的整数,例如: "floor(-1.5)" 是 "-2.0".
  • gauss(x) 计算 x 的高斯函数, 与 exp(-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 是两个直角边或者原点到 x 和到 y 的举例.
  • if(x, y) 判断 x, 如果不是 0 就返回 y 判断的值,否则返回 0.
  • if(x, y, z) 判断 x, 如果不是 0 就返回 y 判断的值,否则返回 z 判断的值
  • ifnot(x, y) 判断 x, 如果是 0 就返回 y 判断的值,否则返回 0.
  • ifnot(x, y, z) 判断 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, 否则返回 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 是内部变量的索引它将被用来保存 seed/state.
  • root(expr, max)找一个输入的值 ld(0) 是在间隔 0..max 里面的 0;

    • expr 中的表达式必须表示一个连续函数,否则结果是未定义的.
    • ld(0) 用于表示函数输入值, 这意味着给定的表达式将被多次求值, 并且表达式可以通过 ld(0) 来访问该表达式. 当表达式求值为 0 时,将返回相应的输入值.
  • round(expr) 将表达式的值四舍五入到最近的整数. 例如: round(1.5)" 是 "2.0".
  • sin(x) 计算 x 的正弦.
  • sinh(x) 计算 x 的双曲正弦.
  • sqrt(expr) 计算 expr 的平方根. 这相当于 "(expr)^.5".
  • squish(x) 计算表达式 1/(1 + exp(4*x)).
  • st(var, expr) 将表达式 expr 的值存储在一个内部变量中. var 指定了存储该值的变量的数量, 它的值从 0 到 9. 函数返回存储在内部变量中的值. 注意: 变量当前不是在表达式之间共享的.
  • tan(x) 计算 x 的正切.
  • tanh(x) 计算 x 的双曲正切.
  • taylor(expr, x) taylor(expr, x, id)

    • 求 x 的泰勒级数, 给出一个表示函数在 0 处的导数的表达式 ls(id)。
    • 当级数不收敛时,结果未定义.
    • ld(id) 用于表示 expr 中的派生顺序,这意味着给定的表达式将多次使用表达式可以通过 ld(id) 访问的各种输入值进行计算. 如果没有指定 id 则假定为0.
    • 注意: 当你用 y 而不是 0 时, 可以用 taylor(expr, x-y). *
  • time(0) 返回当前时间 (Wallclock) 秒为单位.
  • trunc(expr) 将表达式 expr 的值四舍五入为 0 到最近的整数, 例如: "trunc(-1.5)" 是 "-1.0".
  • while(cond, expr) 当表达式 cond 非 0 时求表达式 expr 的值,并且返回表达式 expr 的值, 如果 cond 的结果一直是 false 的话,就返回NAN.

下边这些常量是可用的:

  • PI 圆周率派. 3.14
  • E 自然对数的底数, 是一个无理数, 约等于2.718
  • PHI 黄金比例 (1+sqrt(5))/2, 约等于 1.618

案例

跑马灯效果(滚动字幕)

从左往右滚

ffmpeg -i input.mp4 -vf "drawtext=text=hello :expansion=normal:fontfile=foo.ttf: y=h-line_h-10:x=(mod(5*n\,w+tw)-tw): fontcolor=white: fontsize=40: shadowx=2: shadowy=2" output.mp4

从右往左滚

The scroll will start at t = 4.5s and a character will scroll across the width in 5.5 seconds.

ffmpeg -i input.mp4 -vf "drawtext=text=string1:fontfile=foo.ttf:y=h-line_h-10:x=w-(t-4.5)*w/5.5:fontcolor=white:fontsize=40:shadowx=2:shadowy=2"

This one loops.

-vf "drawtext=text='abcd':fontfile=bpmono.ttf:y=h-line_h-10:x=w-mod(max(t-4.5\,0)*(w+tw)/5.5\,(w+tw)):fontcolor=ffcc00:fontsize=40:shadowx=2:shadowy=2"

从右往左滚,单次滚动时长10秒,间隔30秒滚一次

ffmpeg -i input.mp4 -filter:v drawtext="fontfile=Microsoft YaHei Mono.ttf:text='Hello World':fontcolor=white@1.0:fontsize=36:y=h-line_h-10:x=w-tw-w/10*mod(t\,30):enable=gt(mod(t\,20)\,10)" -codec:v libx264 -codec:a copy -y output.mp4

问题

drawtext 随机字幕 不生效 t 参数 换 n ,具体是什么原因 没有查明确

drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=if(eq(mod(t\,30)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(t\,30)\,0)\,rand(0\,(h-text_h))\,y)"
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=if(eq(mod(n\,30)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(n\,30)\,0)\,rand(0\,(h-text_h))\,y)"

官方文档【最新】【最详细】

点赞(0) 打赏

Comment list 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部