AviSynthのぺーじ/AviSynthの文法

これは、かつて「にーやんのAviSynthのぺーじ」として公開されていたものを転載したものです。内容は古く、間違いも含まれている可能性があります。より正確で新しい情報を知りたい場合は、AviSynth 付属のヘルプや AviSynth 公式サイトを参考にすることをおすすめします。AviSynth WikiAviSynth入門なども活用してください。

AviSynthの文法

 Avisynthでは次のような記述の仕方が認められています。

  1. 変数名 = 式
  2. return

 マニュアルの最初のほうに書いてあるやつです。

 といっても、じつはこの記事を書くまでは、私はまともに読んだことがありませんでした。今もちゃんと読んだわけではないです、ハイ(汗)

 みなさん、マニュアルはちゃんと読みましょうね(笑)

 文法というだけで引いてしまう人もいるかもしれませんが、前回に引き続き、次のスクリプトを使用して、なるべく具体的に説明していきたいと思います。

colorbars_flip1.png

 これです。

 カラーバーを上下反転させるスクリプトでしたね。

 では、順に見ていきましょう。

1.変数名 = 式

 式というのは「ColorBars(320,240)」や「FlipVertical()」などのことです。要するにフィルタに関する命令文です。これは各フィルタの書式に従って記述されなければならないということは、すでに述べましたね。

 また、式は式の結果も同時に表します。そして、式の結果は必ずビデオクリップになります。

 つまり、「ColorBars(320,240)」で320x240サイズのカラーバーというクリップが作られ、「FlipVertical()」でカラーバーはこれを上下反転させたクリップになり、次に別のフィルタをかければ、さらにそのフィルタをかけたクリップになり・・・と、どんどん別のビデオクリップに変化していくわけです。

 そして、この式(つまりビデオクリップ)は任意の変数に代入することができます。

 変数とは、一時的にビデオクリップを入れておく「容れ物」のようなもので、ビデオクリップは、この容れ物(変数)の中に入れることができるのです。

 変数の名前は50文字以内の半角英数字( _ (アンダースコア)含む)であれば何でもかまいません。videoでもaudioでもniiyanでも(笑)

 ただし、数字から始まる名前は使えないので注意してください。

error_fname.png

 VirtualDubModのスクリプト・エディタでは数字から始まる文字列は赤くマーキングされます。このような表示になった場合、エラーが出る可能性が高いです。

 アンダースコア( _ )を先頭につけたり、アルファベットから始まる変数名なら、どのような名前でもOKです。

 ためしに、さきほどのスクリプトの「ColorBars(320,240)」をclipという名前(そのままですね)に置き換えてみましょう。

 「ColorBars(320,240)」という式(ビデオクリップ)をclipという名前の変数にあてはめるわけですから、

clip = ColorBars(320,240)

とすることができます。

 そしてこのclipをFlipVerticalの引数(カッコの中にいれる値のことでしたね)として指定することができます。

colorbars_flip2.png

 つまり、左のように記述することができるわけです。

 一行目で320x240サイズのカラーバーを作成し、このカラーバーをclipという変数に置き換えています。これ以降、カラーバーを別のフィルタで使いたいときには、clipで表すことができるようになります。

 実際に上の例では、二行目のFlipVerticalフィルタの引数として、この変数clip(つまりカラーバー)を指定しています。

 ちなみにこのclipという変数名はデータ型clipとも引数名clipとも別物です(結果的に引数名=変数名となるわけですが)。

 たまたま名前を一緒にしてしまったのでややこしくなってしまいましたが、もしわかりにくいようならば別の名前にしてもかまいません。

 では変数の指定を省略した場合はどうなるのでしょうか?

 それが2の「式」になります。

2.式

 じつは、これは今までやってきた書き方のことです。

 単に「Version()」とか「ColorBars(320,240)」とか書く方法です。

 ここで覚えておきたいのは、「変数名 =」の部分を省略した場合、ビデオクリップは変数lastに割り当てられるということです。

 変数指定が省略された場合のために、最後に処理したクリップを意味するlastという特別な変数が予約されているのです。

 このため、単に「ColorBars(320,240)」と書いただけの場合には、

last = ColorBars(320,240)

と、カラーバーのビデオクリップが自動的にlastという変数に代入されている(のと同じ)ことになります。

colorbars_flip4.png

 ですから、最初のスクリプトは左のように、まず「ColorBars(320,240)」をlastという変数に指定し、次にそのlastFlipVerticalの引数としたのと同じになります。

 ん?ちょっと待てよ。二行目の「FlipVertical(last)」もlastに置き換えられるんじゃないのか?

 そのとおりです。

 「FlipVertical(last)」はビデオクリップであり、このスクリプトの最後に処理したクリップになります。そして、「変数名 =」の部分を省略した場合、ビデオクリップは特別な変数lastに割り当てられるのですから、「FlipVertical(last)」もlastに代入されることになります。

colorbars_flip16.png

 つまり、こうなるわけです。

 lastが3つもあって混乱するかもしれませんが、一行目のlastと二行目のFlipVerticalのカッコの中のlastは同じカラーバーのビデオクリップを表しています。

 二行目の先頭のlastFlipVerticalフィルタを適用し、上下反転させたあとのクリップになります。

 ただし、このスクリプトを実行するとエラーが出ます。

error_colorbars_flip16.png

# 二行目:

The script's return value was not a video clip

(スクリプトの戻り値がビデオクリップではなかった。)

 戻り値(返り値ともいう)とは、関数が実行された結果として別の関数やプログラムに渡される(戻される)値のことです。

 ん〜少しわかりにくいですね。どこかの文章をそのまま引用しただけみたいです(笑)

 そこで、これをAviSynthスクリプトに限定して言い換えてみることにします。

 戻り値*1とは、あるビデオクリップにフィルタ処理を行った結果として別のフィルタやアプリケーションに渡されるビデオクリップのことです(式の結果はビデオクリップでしたね)。

 先ほどのスクリプトでは320x240サイズのカラーバーを上下反転させたビデオクリップ(以下、「反転カラーバー」と呼ぶことにします)を作り出しました。これはFlipVerticalフィルタに引数last(この場合、元のカラーバーのこと)を渡して処理した結果できたビデオクリップでした。

 このスクリプトはこれでおしまいです。これ以上、フィルタはかけません。

 ということは、あとはこの反転カラーバーをAVSファイルに対応したアプリケーション(VirtualDubModなど)に渡せばいいことになります。

 そのためには、ここで「戻り値のビデオクリップは反転カラーバーですよ」と宣言してやらなければなりません。

 そうしないと、AviSynthはどのビデオクリップをアプリケーションに渡していいのかわかりません。さきほどのエラーは、このために生じたエラーでした。

 そして、この戻り値を宣言する記述法が、次の「return 式」です。

3.return 式

 「return 式」(return文)で、式の結果としてのビデオクリップを戻り値として返します。

colorbars_flip17.png

 たとえば左のスクリプトの場合は、320x240サイズのカラーバーをアプリケーションに渡します。

 反転カラーバーの場合はどうでしょう。

 反転カラーバーには最後に処理したビデオクリップ(last)という変数名が与えられていますので、return文を使って「戻り値はlastです」と言えばいいことになります。

colorbars_flip20.png

 左の図のように、スクリプトの最後(にしたい場所)にreturn lastと書けばいいのです。

 これで、このスクリプトにおける戻り値はlast(反転カラーバー)であるということになり、test.avsをアプリケーションで開くと、反転カラーバー(last)が表示されるようになります(プレビュー可能なアプリケーションの場合)。

 ここで話は元に戻ります。

まとめ

colorbars_flip1.png
colorbars_flip20.png

 上がオリジナルのスクリプト、下が今回解説した変数lastreturn文を使ったスクリプトです。

 この2つのスクリプトがまったく同じ処理内容を表していることは、おわかりいただけますでしょうか。

 前回まで「バージョン表示」、「カラーバー」、そして「反転カラーバー」と、左のスクリプトのように記述する方法を紹介してきました。いわゆる「2.式」の文法です。

 一方で変数名の指定を省略した場合、ビデオクリップにはlastという特別な変数が割り当てられるということを、今回、紹介しました。

 ですから、変数名の指定を省略した左のスクリプト(「2.式」)は、変数lastreturn文を使って右のスクリプト(「1.変数名 = 式」と「3.return 式」)のように書き換えることができるのです。

 あるいは、左のスクリプトを実行した場合、AviSynthの内部では右のスクリプトと同等の処理を行っていると言うこともできるでしょう。

colorbars_flip21.png

 また、左の図のように任意の変数名を指定することもできます(ただし数字から始まる変数名はNG)。

 実際にみなさんがスクリプトを書くときには、いずれの方法で記述してもかまいません。

 今後、「スクリプト入門」では煩雑さ避けるために変数名の指定を省略することが多くなるでしょうが、変数とreturn文を使った記述方法についても覚えておいてください。将来的には自分でオリジナルの関数を作る方法についても紹介したいと考えていますが、自分で関数を作る場合には後者の記述法が必須となります。

 さて、文法について長々と書いてきましたが、理解できましたでしょうか?

 私も文法についてよく知らなくても何とかやってきましたので(汗)、たとえ今回の話がよく理解できなくてもあきらめる必要はありません。

 念のために、次回は復習もかねて、これまで紹介しきれなかった事柄を補足しておきたいと思います。それをふまえて、より実践的なステップへと進んで行きましょう。

 次回こそは、ちゃんとクイズの答えを紹介します・・・きっと。

最終更新日 2004年3月3日


最終更新日時: 2014-03-12 (水) 23:36:24 (1835d)