ScriptGrammar

スクリプト文法

すべてのAviSynthスクリプトのステートメントは、これらの形式のうちの1つをとります:

  1. 変数名 = 式
  2. return

1つ目の場合、式は評価され、結果(つねにビデオクリップ)は変数名にアサイン*1されます。2つ目の場合、式は評価され、結果は特別な変数lastに割り当てられます。3つ目の場合、式は評価され、スクリプトの"戻り値" -- すなわち、AVSを開くアプリケーションによって描かれるビデオクリップとして使われます。

式は、これらの形式のうちの1つをとることができます:

  1. 数値定数か文字列定数
  2. 変数名かクリップのプロパティ
  3. 関数(引数リスト(Args))
  4. 式.関数(引数リスト(Args))
  5. 式1 演算子 式2
  6. bool式 ? 式1 : 式2

1つ目の場合、式の値は定数の値です。2つ目の場合、値はクリップのプロパティスクリプト変数(これは、前もって初期化されていなければなりません)に相当します。3つ目の場合、値はAVS関数の戻り値です(下記参照)。4つ目の場合は、関数(式, 引数)に相当する、("OOP表記法"と呼ばれる)代替シンタックスです。

最後の2つの場合は、三項演算子を使って条件付きでコードを実行するばかりではなく、int、float、val、boolに関して期待されるように、通常の計算や(C言語からの)論理演算子のすべてを使って、式を操作することができるということを示しています。文字列は'+'を使って連結することができます。また、以下の演算子は、ビデオクリップに関して、次のように定義されます: a + bUnalignedSplice(a, b)に相当し、a ++ bAlignedSplice(a, b)に相当する。

AviSynthのスクリプト言語における関数は、概して、ビデオフィルタです(あなた自身のスクリプト関数を定義することもできます)。関数は60個までの引数をとることができ(それで十分足りることを望みます)、戻り値はつねにクリップです。関数は、つねに新しいビデオクリップを生成します。けっして存在するクリップを修正するのではありません。各内蔵フィルタ用の関数呼び出しのシンタックスを見るためには、FiltersByCategoryを見てください。

注釈: 実は関数は、それが選ぶどのようなタイプ(の結果)をも返すことができます。これは、スクリプトの中で再利用するユーティリティ・コードを作成するために役に立つ特徴です。しかしながら、クリップを返さない関数は、つねに、引数としてフィルタ(クリップを返す関数)に渡す、変数の中間処理に限定されます。スクリプトは、いつも、最終的な値として、クリップを返さなければなりません。結局、AviSynthは、ビデオ処理アプリケーションなのです。

引数リスト(Args)は、コンマによって区切られた、関数の引数のリストです。引数リストは、空にすることもできます。各引数は、文字列、整数、浮動小数点数、またはビデオクリップ(すなわち、式)でなければなりません。フィルタ関数が1つ目の引数としてビデオクリップを期待していて、なおかつ、その引数が与えられないとしたら、そのときは、特別なlast変数の中のクリップが使われるでしょう。

AviSynthのフィルタは、名前付きの引数を取ることができます。名前付きの引数は、どんな順番でも、指定することができます。そしてフィルタは、使用するのをやめた引数に対しては、デフォルト値を選びます。たとえば、Subtitle("Hello, World!", 100, 200, 0, 999999, "Arial", 24, $00FF00)の代わりに、Subtitle("Hello, World!", text_color=$00FF00, x=100, y=200)と書くことができます。は、上記の例のような16進法か10進法で指定することができます。どちらの場合も、たとえクリップ自体がYUVでも、それはRGB値として指定されるべきです。

また、あなたは、たとえば「フィルタ名 引数1 引数2」のように、関数を丸括弧なしで呼び出すこともできます。このような書き方をする主な理由は、古いスクリプトとの互換性を維持するためです。しかし、混乱の可能性がないときに、丸括弧を使用しないことは、時には、便利です。

AviSynthは、#記号から行末までのあらゆるものを無視します。これは、スクリプトにコメントを付け加えるために利用されます。

AviSynthは、大文字と小文字の別を無視します: aViSouRCeは、AVISourceとまったく同じです。

複合的なAviSynthステートメントを一行に記述することは、以下のように、OOP表記法のコンテキストか、フィルタを別の関数のパラメータとして埋め込むことにおいてのみ可能です:

AviSource("c:\video.avi").Trim(0, 499)

または

AudioDub(AviSource("c:\video.avi"), WavSource("c:\audio.wav"))

AviSynthステートメントは、バックスラッシュ("\")*2を、拡張される行の最後の非スペース文字として、もしくは、次の行の最初の非スペース文字として配置することによって、複数行にまたがって分割することができます。

行分割の例(どちらも有効であり、かつ等しい):

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) # いくつかのフレームを選択する  \
+Trim(20,29)

"\"がその前の#記号によって隠されているため、上記の例は、意図されたようにフレーム[0..9,20..29]を返しません。したがって、行の継続は、けっして起こりません。

AviSynthManualに戻る


註: このページは、http://www.avisynth.nl/ScriptGrammarの日本語訳です。


*1 割り当てる、という意味。
*2 訳者註: 日本語環境では、半角の円記号(¥)。

最終更新日時: 2014-03-12 (水) 23:40:20 (3691d)