语法:脚本变量

来自NMM Doc
跳转至: 导航搜索

此页会讲解如何在脚本中使用变量存储处理过程中的值,用来做进一步的处理。同时也会描述脚本可以操作的数据类型,以及如何书写变量。


实际上变量名可以是一个任意长度的字符串(从v2.56开始可以有4000个字符以上),可以是(英文)字母、数字和下划线(_)的组合,但不能有其他的字符。变量名不得用数字开头。

你也可以在字符串和文件名中使用你系统的本地编码。

变量在表达式中的位置取决于

语法

变量可以有以下类型:

  • clip (剪辑)
一个视频片段包含视频轨和/或音频轨。一个脚本返回的值必须是这种类型。
  • string (字符串)
一串代表文字的字符序列。字符串的写法是把字符用“引号”或“三重引号”括起来。文字包含除了两端引号或三重引号之外的任何字符。

手册以前提到多TeX式样的引号,但是v1.03以后的Avisynth确实无法使用这种风格。如果你想在字符串中打引号,只需用Python式样的“三重引号”。比如:

Subtitle("""AVISynth is as they say "l33t".""") 

此外,你也可以用在字符串里用Windows扩展ASCII字符集的引号(curly-quotes),而不直接写引号,这样也能避免此类限制。

  • int (整数)
一个整数。输入一串数字,成为一个整数变量。在数字前面也允许有正号(+)或负号(-)。在十六进制的字符前面加上$的话,也可以作为数值。比如$ff或$FF(大小写没有影响)等于255.
  • float (浮点)
有小数点的数。输入一串包含小数点的数字,成为浮点变量,也可以有正号(+)或负号(-)。例如,+1. 是浮点类型。注意不支持指数记号。
  • bool (布尔)
布尔值必须是“true”(真)或“false”(假)。此外也可以写作“yes”或“no”,但是应该尽量避免在脚本里这样写。(保留“yes”和“no”仅仅是出于兼容性的目的)。
  • val (变量)
一个通用类型的名字。只能用在自定义脚本函数的变量列表里,目的是为了能够声明一个任意类型(int、float、bool、string或clip)的参数变量。必须明确它的类型(用布尔函数),再做恰当的处理。


还有另一种只在Avisynth处理内部使用的类型 - void(空)或“undefined”(未定义),主要和可选的函数的参数一起使用。


变量可以是局部的(限制在正在执行的脚本的局部尺度)或是全局的。全局变量的范围是所有脚本环境的尺度,所有内部函数、用户定义函数、运行环境脚本和主脚本都可以访问。

要定义和/或给一个全局变量赋值,在赋值语句中,变量名的左边必须添上关键字“global”。在读取全局变量是,并不需要(实际上也不允许)写这个关键字。比如:

global canvas = BlankClip(length=200, pixel_type="yv12")
global stroke_intensity = 0.7
...
global canvas = Overlay(canvas, pen, opacity=stroke_intensity, mask=brush)

想要声明一个变量,仅仅需要在变量名称之后加上“=”(等号),再加上初值就够了。类型不必声明;类型靠给它赋的初值确定(而且也能被以后的赋值语句改变)。唯一允许声明变量类型的地方只有用户定义函数脚本的参数列表里(虽然没有严格要求)。比如:

b = false      # 声明了一个初值是“false”(假)的布尔变量,变量名是“b”
x = $100       # 整数类型(初值是十六进制)
y = 256        # 整数类型(初值是十进制)
global f = 0.0 # 浮点类型的全局变量
...
function my_recolor_filter(clip c, int new_color, float amount, val "userdata") { ... }