语法:用户自定义脚本函数

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

定义和结构

你可以像下面描述的一样,在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)。只要把参数名用双引号引起来,就成为命名参数。当定义完一个命名参数后需要注意:
  1. 参数列表中所有后面的参数都必须也是命名参数。
  2. 命名参数是一个可选的参数,也就是说在调用函数时可以不提供。
  3. 当调用函数时,如果不提供可选的参数,那么这个参数会被设为void(“undifined”)(空/未定义)类型。但并不是乱来一个参数值 - 纯粹只是表示这个类型既不是Clip、整数、浮点,也不是布尔或字符串,仅仅“没有”可用的值而已。
  4. 一般性,需要用Define函数测试一个可选的参数是否有明确的值,或用Default,既有Define的测试功能,在适当情况下也能传递一个默认值。
  5. 一个void(“undifined”)值可以传递给其他的函数,也作为那个函数的可选参数。当你想创建一套调用别的函数的函数,这个功能可以保持相同的默认设置。
  • 函数一般计算出一个新值,而从不会更改已经存在的值。这就意味着函数所有的参数都是“按值”传递的而不是“按参考 - By reference”传递的。在Avisynth脚本语言中,为了改动一个值应该首先去赋一个新的值。
  • 函数可以调用另一个函数,包括它本身。这个方式称为递归。递归是一个创建实现复杂任务的非常有用的功能。
  • 局部的函数变量会把相同变量名的全局变量覆盖掉。例如,如果给myvar赋值,定义一个myvar变量,那在函数内部就无法访问叫myvar的全局变量了。
  • 上述情况对参数同样成立,因为在函数看来,参数是最初的局部变量。

相关链接

共享函数,一个由AviSynth成员共同创建的,不断增多的共享函数合集。