語法

出自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]幀,因為「\」被前面的#注釋掉了,因此兩行不可能相連。