語法:用戶自定義腳本函數

出自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成員共同創建的,不斷增多的共享函數合集。