语法:用户自定义脚本函数
跳到导航
跳到搜索
定义和结构
你可以像下面描述的一样,在AviSynth中定义、调用自己的函数。函数能返回任意的变量类型。一个用户自定义脚本函数是一个独立的脚本代码模块,每调用一次脚本中的函数,都会执行这个脚本代码一次。下面紧接着的是一个简单的的用户自定义脚本函数(是一个自定义的滤镜):
function MuteRange(clip c, int fstart, int fend) { before = c.Trim(0, -fstart) current = c.Trim(fstart, fend) after = c.Trim(fend + 1, 0) audio = Dissolve(Dissolve(before, current.BlankClip, 3), after, 3) return AudioDub(c, audio) }
用户自定义脚本函数以关键字“function”开始,后跟函数名。脚本函数命名规则和脚本变量规则一致。
函数参数列表紧随函数名之后。列表(可以为空)以(所期望的参数类型 - 参数名)对组成。各参数类型可以是AviSynth支持的任意变量类型。
function MuteRange(clip c, int fstart, int fend)
然后是函数主体,也就是每次调用函数时执行的代码。参数在函数主体内按名称进行访问。函数主体由一对大括号{...}括起来。
{ before = c.Trim(0, -fstart) current = c.Trim(fstart, fend) after = c.Trim(fend + 1, 0) audio = Dissolve(Dissolve(before, current.BlankClip, 3), after, 3) return AudioDub(c, audio) }
在函数主体的结尾处,需要有一个return声明,返回从参数和函数主体中计算出的最终结果。
return AudioDub(c, audio)
需要注意的是,不像其他的脚本语言那样在函数主体里支持多重返回声明,AviSynth的函数只能包含单个返回声明。因为这个脚本语言并不支持分支(也就是复合声明)。
一些关于用户自定义脚本函数的真相
- 函数可以有60个参数,而且可以返回任何Avisynth支持的类型(Clip、整数、浮点、布尔和字符串)。
- 虽然不推荐,但实际上可以忽略参数的类型,这种情况下参数类型被定为通用类型“val”。
- 如果函数期望第一个参数是Clip类型,而且没有提供这个参数,那么Clip会使用last这个特殊的变量。
- 函数支持命名参数(named argument)。只要把参数名用双引号引起来,就成为命名参数。当定义完一个命名参数后需要注意:
- 参数列表中所有后面的参数都必须也是命名参数。
- 命名参数是一个可选的参数,也就是说在调用函数时可以不提供。
- 当调用函数时,如果不提供可选的参数,那么这个参数会被设为void(“undifined”)(空/未定义)类型。但并不是乱来一个参数值 - 纯粹只是表示这个类型既不是Clip、整数、浮点,也不是布尔或字符串,仅仅“没有”可用的值而已。
- 一般性,需要用Define函数测试一个可选的参数是否有明确的值,或用Default,既有Define的测试功能,在适当情况下也能传递一个默认值。
- 一个void(“undifined”)值可以传递给其他的函数,也作为那个函数的可选参数。当你想创建一套调用别的函数的函数,这个功能可以保持相同的默认设置。
- 函数一般计算出一个新值,而从不会更改已经存在的值。这就意味着函数所有的参数都是“按值”传递的而不是“按参考 - By reference”传递的。在Avisynth脚本语言中,为了改动一个值应该首先去赋一个新的值。
- 函数可以调用另一个函数,包括它本身。这个方式称为递归。递归是一个创建实现复杂任务的非常有用的功能。
- 局部的函数变量会把相同变量名的全局变量覆盖掉。例如,如果给myvar赋值,定义一个myvar变量,那在函数内部就无法访问叫myvar的全局变量了。
- 上述情况对参数同样成立,因为在函数看来,参数是最初的局部变量。
相关链接
共享函数,一个由AviSynth成员共同创建的,不断增多的共享函数合集。