AviSynthのぺーじ/書式とフィルタの記述方法

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

書式

 AviSynthのマニュアルが「フィルタ名」、「書式」、「フィルタの説明」の順に書かれていることはすでに述べました。

 このうち、2つ目の「書式」とは「そのフィルタの書き方(設定方法)を表したもの」であると言えます。

 しかしマニュアルには、「Version(clip clip)」や「ColoBars(int width, int height)」などと書かれているだけで、これでは実際にどのように書いたらいいのかわからないかもしれません。

 じつは書式は次のような順序で書かれているのです。

フィルタ名(データ型1 引数1, データ型2 引数2, データ型3 引数3, ...データ型n 引数n)

(1)フィルタ名

 フィルタ名はわかりますね。VersionColoBarsのことです。

(2)データ型

 データ型は引数がどのような種類であるかを示すものです。

 ColorBarsフィルタで言うとintがデータ型になります。intの意味については後で説明します。

 引数の種類を表すだけのものなので、スクリプトを記述する際にデータ型を書く必要はありません。

 ていうか、書いちゃダメです。

(3)引数

 引数は実際にカッコの中に書くもので、フィルタの設定値(パラメータ)のことです。

 ColorBarsフィルタではwidthやheightが引数になります。ただし、widthやheightというのは引数の名前ですので、実際に書くのは数字や文字列などデータ型で指定されたものになります。

 ここで指定した引数がフィルタ(関数)に渡され、それに応じてフィルタが実行されます。たとえば、ノイズ除去を強めに、あるいは弱めにといった調整は、この引数を変更することによって行います。

 一つのフィルタが取る引数の数はフィルタによって異なり、デフォルト値が指定されている場合は省略することも可能です。

データ型

 AviSynthで使われるデータ型には次のようなものがあります。

clipビデオクリップ。省略した場合、最後に処理されたクリップ(last)が指定される。
int整数。integer(整数)の略。フィルタによって指定できる範囲が異なる。頭に$を付けることで16進数で指定することも可能。(例)$ff = 255。
float小数。floating-point number(浮動小数点数)の略。 フィルタによって指定できる範囲が異なる。
bool論理型(boolean)。true(真)、または、false(偽)。
string文字列。ダブルクォーテーション(")で囲む。
globalglobal変数の宣言。すべての関数やAVSファイルから参照可能になる。

10進数<->16進数

 intを「16進数で指定することも可能」とありますが、これは主に色指定の場合に使われます。HTMLなどで色指定に使われるカラーコードと一緒です。白だったらffffff、黒だったら000000です。

 ただし、頭に付けるのは#ではなく$です。それはなぜか?

 #はAviSynthでは特別な意味をもっていましたね。

 そうです。#を頭につけると、その行のスクリプトが無効になるからです(他にも理由があるかもしれませんが・・・)。

 カラーコードについては「とほほの色入門・色見本」などを参考にしてください。他にも「カラーコード」や「色見本」などの単語で検索すれば、関連ホームページがたくさん見つかると思います。

 また10進数(私たちがふだんよく使う数の表し方。10ごとに1繰り上がる)から16進数への変換だけなら、Windows付属の電卓を使って簡単に行うことができます。

dentaku1.png

 [スタートメニュー]->[プログラム(P)]->[アクセサリ]から電卓を起動します。

 メニューの[表示(V)]->[関数電卓(S)]を選択します。

dentaku2.png

 「10進」にチェックが入っていることを確認してから、適当な数字を入力します(左の図では255)。

dentaku3.png

 「16進」にチェックを入れると、16進数に変換された数字が表示されます(左の図では10進数255が16進数FFに変換されている)。

練習問題

 文章だけの説明ではわかりにくいので、実際に例を使ってデータ型別の記述方法を解説してみたいと思います。

 使用するフィルタは「MessageClip」です。名前の通り、メッセージ入りのクリップ(動画)を作成するフィルタです。おそらく、ほとんど使うことがないフィルタだと思います(^^;

 マニュアルでMessageClipを見てみましょう。

MessageClip

MessageClip(string message, int "width", int "height", bool "shrink", int "text_color", int "halo_color", int "bg_color")

MessageClip produces a clip containing a text message; used internally for error reporting. Arial font is used, size between 24 points and 9 points chosen to fit, if possible, in the width by height clip. If shrink is true, the clip resolution is then reduced, if necessary, to fit the text.

 いつものように適当に訳してみます。

MessageClip

MessageClip(string message, int "width", int "height", bool "shrink", int "text_color", int "halo_color", int "bg_color")

MessageClipは文字メッセージを含むクリップを生成します。エラー報告のために内部で使われています。Arialフォントが使用され、24ポイントから9ポイントまでの文字サイズが、可能ならば、width×heightのクリップの画面にフィットするように選ばれます。shrinkがtrueの場合、必要に応じて、そのクリップの解像度は文字にフィットするように縮小されます。

 書式を見ただけで嫌気がさした人もいるかもしれませんが、がんばって少しずつやってみることにしましょう。

 失敗してもいいんです!

 AviSynthのスクリプトでエラーが出たくらいでPCがぶっ壊れるとかいうことはない(と思う)ですから。

 まずmessageですが、引数の名前からして、表示させたい文章を書く場所のようです。データ型はstringですから、ダブルクォーテーション("のこと。二重引用符ともいう)で囲む形で記述しなければなりません。

message1.png

 「本日は晴天なり」と当たり障りのない文章を書いてみました。

 ちゃんと二重引用符で囲んでいます。

 これを保存して、[F5]で更新してみましょう。

 新たにAVSファイルを作成した場合は、適当な名前を付けて保存したあとVirtualDubModで開いてみてください。

message1b.png

 何か表示されてはいますが、文字化けしてしまっています。

 これはMessageClipで使用されるArialフォントが日本語に対応していないからです。

message2.png

 文章を英語に変更します。

 どんな文章でもかまいません。

 では[F5]で更新してみましょう。

message2b.png

 ハイ!うまく行きました。

 指定していない引数に関しては、デフォルトの値が適用されていると考えられます。

 文字色は白、背景色は黒、クリップの解像度は文字に合わせた大きさになっています。

message3.png

 では次にクリップの大きさ(解像度)を指定してみましょう。

 「int "width", int "height"」とあります。

 widthが横幅、heightが高さで、ともにint型ですから、整数で指定することが可能です。

 ColorBarsフィルタと同じですね。

 ここではwidthを320、heightを240としてみます。

 複数の引数を記述するときは、書式の順番どおりに、カンマ(,)で区切りながら、つづけて書きます。

message3b.png

 更新すると、メッセージはそのままで解像度のみ変更されました。

message5.png

 「bool "shrink"」とありますので、shrinkはbool型になります。

 bool型は真ならばtrue、偽ならばfalseと書きます。

 マニュアルの説明文を見ると「shrinkがtrueの場合」に「クリップの解像度は文字にフィットするように縮小され」る、とあります。

 つまり、クリップを文字に合わせたサイズにしたいならtrue、したくないならfalseと書けばいいのです。

 では、ためしにtrueと書いてみることにしましょう。

 ちなみに左の図の\はAviSynthのスクリプトにおいて改行を意味します。

 もしスクリプトの途中で改行したい場合は、\を改行したい行の最後か、改行後の行の先頭に付けてください。

 ここでは説明用の画像サイズの関係で改行しているだけですので、改行せずに「・・・240,」のあとにつづけてtrueと書いてもかまいません。

message5b.png

 widthやheightを指定しなかった時と同じ画像になりました。

 shrinkを省略した場合は指定した解像度になっていたことから、shirnkのデフォルトはfalseである(らしい)こともわかります。

message6.png

 では最後の3つを見てみましょう。

 「int "text_color", int "halo_color", int "bg_color"」

 text_colorは文字色、bg_colorが背景色であることは想像がつくかもしれませんが、halo_colorは何の色なのでしょうか?

 とりあえず、3つとも違う色を指定してみることにします。

 すべてint型ですから、整数(16進数)で指定することになります。

 順に$ff0000(赤)、$0000ff(青)、$ffffff(白)とします。

message6b.png

 文字色(text_color)は赤に、背景色(bg_color)は白に、そして文字の縁の色が青になっていますね。

 halo_colorは文字の縁の色のことでした。

 ちなみにhaloは「後光」とか「(人やものを取り巻く)光」という意味があります。

message8.png

 では一部の引数のみを指定して、あとはデフォルトのままにしたいというときはどうすればいいでしょうか?

 ためしに左のように書いてみました。

 一応、高さを80に、背景を赤($ff0000)にしたいという気持ちで書いてます。

message8b.png

 案の定、エラーが出てしまいましたね。

 「Unrecognized exception」は「認められない例外」というような意味で、引数が想定外のものだった場合に起こります。

 引数は基本的に書式の順番に記述しますので、この場合、AviSynthは高さのつもりで書いた80をwidthと、背景色のつもりの$ff0000をheightと受け取ってしまったのです(※)。

 ではどのようにすればいいのでしょうか?

※ところで$ff0000は10進数に直すことができます。10進数に変換すると16711680です。じつは、この場合、エラーの直接の原因は順番がおかしかったからではなく、数が大きすぎたために起こったものと考えられます。たとえば$0000ff(10進数で255)であれば、エラーは出ずに、幅80、高さ255のクリップが作成されていたと思います。

message9.png

 このように「引数名 = 引数」という形で記述することができます。

 この場合、省略された引数はデフォルトの値が適用されます。

 ただし、すべての引数について、このように指定できるわけではありませんので注意してください。

message9b.png

 [F5]で更新してみると、高さが80、背景色が赤、その他はデフォルトのメッセージクリップが作成できました。

 書式の読み方と記述方法について理解できたでしょうか?

 MessageClipの例で出てこなかったデータ型もありますが、floatについては特に説明する必要はないと思います。小数点以下も指定できるというだけで、記述の仕方はintと変わりません。

 globalは現時点では知らなくても問題がない(ことが多い)ので、とりあえずここでは省略したいと思います。いずれ機会があれば説明したいと思います。

 では、clipはどうか?

 「ビデオクリップ。省略した場合、最後に処理されたクリップ(last)が指定される。」

 ビデオクリップはいいとして、その後はちょっと意味不明かもしれません。それにこれだけだと記述の仕方もわかりませんね。

 次回はこのあたりの話をしたいと思います。

 すでに忘れてる人もいるかもしれませんが、クイズの答えも次回やります。

最終更新日 2003年10月22日

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