语法

来自NMM Doc
跳到导航 跳到搜索

所有基本的Avisynth脚本声明都符合以下的某种形式。

  1. 变量名 = 表达式
  2. 表达式
  3. return 表达式


(也存在两种更高级的结构 - 函数声明try..catch声明


第一种情况,计算表达式的结果,赋给变量名。第二种情况,计算表达式的结果,如果类型是Clip,则赋给一个特殊的变量last。第三种情况,计算出的表达式成为活动脚本的“返回值”——可以是一个函数的“返回值”,也可以是整个脚本的“返回值”。在之后会提到的情况里,返回值往往是可以由打开AVS文件的应用程序看到的视频。简单的说,如果一个表达式中有关键字return,它就会成为一个脚本(或一个脚本block)的结束声明语句。

绝大多数时间,表达式的结果是一个视频Clip,但实际上表达式的结果可以是本脚本语言支持的任何类型(Clip、整数、浮点、布尔、字符串),而且是靠像内部脚本函数这样的模块运算的。

一个表达式有如下的一种形式:

  1. 数字常数字符串常数布尔常数
  2. 变量名Clip属性
  3. 函数(参数)
  4. 表达式.函数(参数)
  5. 表达式1 运算符号 表达式2
  6. 布尔表达式 ? 表达式1 : 表达式2

第一种情况,表达式的值就是常数的值。第二种情况,值和Clip属性语法:脚本变量有关(之前必须经过初始化)。第三种情况,值是AVS函数的返回值(见下文)。第四种情况,是一个替代的写法,(成为“OPP记号”),和函数(表达式,参数)等价。

最后两种情况,可以使用普通的算数和逻辑运算符号(来自C)操作表达式,计算整数、浮点和布尔,甚至使用三重符号的条件执行语句。字符串可以用相关运算符号比较,也可以用“+”合并。以下的运算符号也对视频Clip有定义:a + b等价于Splice(a,b),a ++ b等价于Splice(a,b)。

Avisynth脚本语言中大部分的函数是视频滤镜。尽管函数可以是它选择的任意类型(这个特性对创建在脚本中重复使用的模块代码很有用的特性,你可以定义自己的脚本函数),但是返回一个Clip的函数的作用往往被局限在中间变量的处理,用来给滤镜传递变量。脚本最终应该返回一个Clip。总之,Avisynth是一个视频处理程序。

函数可以有60个参数(希望足够了),而且可以返回任何Avisynth支持的类型(Clip、整数、浮点、布尔和字符串)。函数一般计算出一个新值,而从不会更改已经存在的值。这就意味着函数所有的参数都是“按值”传递的而不是“按参考 - By reference”传递的。在Avisynth脚本语言中,为了改动一个值应该首先去赋一个新的值。

参考内部滤镜一节,学习调用内部滤镜函数的语法。同样也有内部函数,对非Clip变量进行运算。

参数是一个由逗号分开的函数参数列表,可以留空。每个参数必须是一个匹配函数所期望类型的表达式(比如文本字符串、整数、浮点/小数、布尔值或Clip)。如果函数期望第一个参数是Clip类型,而且没有提供这个参数,那么Clip会使用last这个特殊的变量。

Avisynth函数可以使用有名字的参数。有名字的参数能以任意顺序给出,滤镜也会给未指定的参数选择默认值。某些滤镜因此用起来很简单。比如你可以这样写: Subtitle("Hello, World!", text_color=$00FF00, x=100, y=200),而不用写成Subtitle("Hello, World!", 100, 200, 0, 999999, "Arial", 24, $00FF00)。颜色可以像上面的例子里,以十六进制或十进制的数给出。两种情况下颜色都应该用RGB值,即使Clip本身是YUV的。

如果没有给函数传递函数,还是可以不需要括号就调用函数的。比如:函数名。作这种保留的主要原因是考虑老脚本的兼容性。但是当没有混淆的时候,不写括号也很方便。

Avisynth忽略每行#后面的任何字符。这个功能能用来在脚本中添加注释。

# Comment(注释)

在v2.58里允许使用以下的方式添加块注释和嵌套注释

# 块注释:
/* 
comment 1
comment 2
*/
# 嵌套注释:
[* [* a meaningful example will follow later :) *] *]

Avisynth忽略关键字__END__(两个下划线)到脚本结束的所有文字。这个功能可以用来把脚本末尾的命令全部注释掉。

Version()
__END__
ReduceBy2()
Result is not reduced and we can write any text here

Avisynth忽略大小写:aViSouRCe和AVISource等效。

单行之内复合的Avisynth声明只能以OOP记号书写或作为参数内嵌在其他函数内,比如:

AviSource("c:\video.avi").Trim(0, 499)
-或-
AudioDub(AviSource("c:\video.avi"), WavSource("c:\audio.wav"))

Avisynth的声明可以用反斜杠(“\”)分成多行,反斜杠可以是此行的最后一个非空格字符或下一行的第一个非空格字符。

分行示例(两种都可行而且等效):

Subtitle("Hello, World!", 100, 200, 0, \
  999999, "Arial", 24, $00FF00)

-或-

Subtitle("Hello, World!", 100, 200, 0,
  \ 999999, "Arial", 24, $00FF00)

当跨行时,注释只能写在最后一行的后面。在中间行里混杂分行反斜杠会导致错误信息或对寻找脚本漏洞造成困难。

以下的例子错在混杂了注释和分行反斜杠,丢失了信息:

ColorBars
ShowFrameNumber
Trim(0,9) # select some frames  \
  + Trim(20,29)

以上的例子并不如期返回[0..9,20..29]帧,因为“\”被前面的#注释掉了,因此两行不可能相连。