AviSynth2.5初步了解

出自NMM Doc
於 2011年5月29日 (日) 01:13 由 XsLiDian討論 | 貢獻 所做的修訂 (+ Category:AviSynth 使用
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
跳至導覽 跳至搜尋

視頻編輯

  基本上來說,AviSynth是這樣工作的:首先,你會創建一個包含命令的簡單文本文檔,它叫做腳本。這些命令代表若干個你想要的視頻以及想要運行的濾鏡。然後,當你運行一個視頻程序,例如VirtualDub,並且打開剛才的腳本時,AviSynth就會運作起來。它會加載腳本中的視頻,並且運行指定的濾鏡,然後將結果輸出給視頻程序。然而視頻程序並不知道AviSynth在後台運行,而是以為自己在直接讀取一個硬盤上的AVI文件。

  AviSynth2增加了很多新功能,為了突出這些功能(尤其因為他們在以前的文章中都沒有被完好闡述過),我們在這篇文章中把它們標記為v2

  由於v2.5在內核上做了較大的升級,請在使用前仔細閱讀AviSynth v2.5。相關升級都被標記為v2.5

線性編輯:

  在AVISynth里能做的最簡單的事就好比在VirtualDub里的編輯視頻。因為這些語句都太好寫了,不需要擔心變量以及複雜的表達式。

  作為測試,請先創建一個文件命名為「test.avs」,然後輸入如下一行文字:

Version

  現在用Windows Media Player或其他來打開這個文件,你會看到一個10秒鐘的寫有AVS版本號及版權信息內容的視頻片段。

  Version叫做「源濾鏡」,這意味着它的作用是生成片段而非修改。在AVISynth腳本中第一個命令永遠是源濾鏡。

  現在加入第二句,讓它看起來是這樣:

Version
ReduceBy2

  在Media Player中再次打開這個文件,你應該還可以看到那些版權信息,不過只有以前的一半大小。ReduceBy2是一個「變換濾鏡」,它會以某種方式改變原有的視頻片段。你可以連續使用多個變換濾鏡就好像在VirtualDub里一樣。

  讓我們再加一句使視頻變成淡出至黑色的結尾,它應該是這個樣子:

Version
ReduceBy2
FadeOut(10)

  現在再次打開文件,片段的前9秒應該是一樣的,而最後一秒會平滑的淡出到黑色。

  FadeOut濾鏡需要一個數值,用來代表淡出所需的幀數。

  漸變開始之前的時間太長了,所以我們需要修剪視頻的起始部分以減少等待的時間。

  我們扔掉前120幀,保留120-150幀:

Version
ReduceBy2
# 砍掉前119帧,保留120-150帧
# (AVISynth的起始帧数是从0算起的)
Trim(120,150)
FadeOut(10)

  在這個例子中,我們第一次使用了注釋。

  注視以」#」開頭,一直到最後一個字母結束,是被AVISynth完全忽視掉的。Trim濾鏡需要兩個數值,以逗號「,」(英文半角,AVS腳本內一切皆為英文半角)分開,兩個數分別代表視頻中要保留的起始幀和中止幀,若最後一幀輸入的是0,就代表到視頻片段的最後一幀。所以如果要砍掉前119幀,可以輸入Trim(120,0)。

  像這樣把幀數仔細記錄真是一件麻煩事,在VirtualDub等這樣的程序里直接打開一個部分完成的腳本就方便多了,它會把幀數都為你顯示出來。你還可以用ShowFrameNumber濾鏡,它會把幀數直接打在視頻上。

  其實實際使用中在AVISynth里有一個比Version實用很多的源濾鏡,就是AVISource,它用來從硬盤中讀取一個AVI(或其它視頻格式)的文件。如果你手頭上已經有了一個AVI文件,那麼你可以試試把這些相同的濾鏡加到你的文件上。

AVISource("d:\capture.avi")  # 这里要写你实际的路径和文件
ReduceBy2
FadeOut(15)
Trim(120,0)

  只有單獨一行AVISource命令的腳本可以為只支持小於2GB文件的視頻程序提供大於2GB文件的支持。


非線性編輯:

  好了我們到了有趣的部分了,建立一個有如下語句的AVS文件:

StackVertical(Version, Version)

  打開它,結果是這樣:輸出的視頻中有兩行一模一樣的版本信息,一行在另一行之上。

  StackVertical不需要數值或是字符串作為參數,而是需要視頻剪輯。在以上語句當中Version濾鏡被兩次調用,每一次都返回給StackVertical一個版本信息的視頻,於是StackVertical把它們拼在一起(不管那視頻從哪兒來的)。

  UnalignedSplice也是有用的此類濾鏡之一,它可以將視頻剪及首尾相接,這段語句就是將3段視頻(例如可能是AVI_IO生成的)讀取並連接在一起:

UnalignedSplice(AVISource("d:\capture.00.avi"), \
  AVISource("d:\capture.01.avi"), \
  AVISource("d:\capture.02.avi"))

  StackVertical和UnalignedSplice都可以接受少到兩個多到六七十個的視頻。你也可以用加號「+」代替UnalignedSplice,作為速記。

  比如說這段語句,與上段語句的功能是一樣的:

AVISource("d:\capture.00.avi") + \
  AVISource("d:\capture.01.avi") + \
  AVISource("d:\capture.02.avi")

  現在假設你的一個程序捕捉到的視頻存到了多個AVI片段里,但音頻又存到了一個單獨的WAV文件里,你能把他們重新組合在一起麼?你說呢:

AudioDub(AVISource("d:\capture.00.avi") + \
  AVISource("d:\capture.01.avi") + \
  AVISource("d:\capture.02.avi"), \
  WAVSource("d:\audio.wav"))

語法

表達

  一個AVISynth的腳本當中會有形如以下的陳述:

variable_name = expression  (变量名 = 表达)

  在這個例子當中expression被求值並將結果賦予variable_name

  還有一個很重要的省略形式:

expression

  以上語句當中expression被求值並將結果賦予一個特殊的視頻片段變量last。

  功能與以下語句相同:

last = expression

  結尾通常是這樣:

return expression

  在這裡expression被求值並用作了這個腳本的返回值,也就是說,若這個AVS文件被打開,視頻程序看到的僅是這個值的視頻片斷。

  若返回值沒有被特意指派,那麼last的值就會被用作返回值。

  基本的調用函數的表達如下:

Function(args)  函数(参数)

  視頻剪輯函數從來都是創建一段新視頻而不更改現有視頻。

  args是一串以逗號「,」分隔開的函數參數列表,這個列表可以是空的(意味着所有參數或者部分參數可選)。

  如果濾鏡函數的第一個參數是一個視頻剪輯,並且這個視頻剪輯並沒有被提供,那麼將用特殊變量last來替代。

  AVISynth的濾鏡可以識別指定參數(arg=expression),它們之間的順序可以隨意調換。沒有被指定的參數將使用默認值,這會使某些濾鏡用起來簡單些。

  你可以寫:

Subtitle("Hello, World!", text_color=$00FF00, x=100, y=200)

  而不用這樣:

Subtitle("Hello, World!", 100, 200, 0, 999999, "Arial", 24, $00FF00)