VirtualDubプラグインを利用する

はじめに

このページでは、AviSynth で VirtualDub のプラグインを利用する方法を紹介します。

VirtualDub のプラグインを AviSynth で利用するには

AviSynth で VirtualDub のプラグインを利用するためには、基本的に以下のような手順が必要となります。詳しくは後で説明しますが、まずは簡単な流れを知っておいてください。

  1. LoadVirtualDubPlugin という関数を使って、VirtualDub のプラグインの読み込みと、そのプラグインのフィルタを AviSynth で呼び出すときに使用する関数の名前を指定する。
  2. クリップの色空間が RGB32 でない場合は、前もって RGB32 に変換する。
  3. 1 で指定した関数を呼び出す。
  4. 必要があれば、RGB32 以外の色空間に再変換する。

RGB32 に変換する理由

VirtualDub のプラグインは、RGB32 で動作します。このため、もしクリップの色空間が RGB32 ではない場合は、前もって RGB32 に変換しておく必要があります。RGB32 への変換には、AviSynth 内蔵の ConvertToRGB32 フィルタを使用します。

vdub_filters.avs を使う方法

vdub_filters.avs とは?

簡単に言うと、vdub_filters.avs は「VirtualDub のプラグインを AviSynth で利用するには」の 1 の手順をあらかじめ行ってくれているものである、と言うことができます。実際に vdub_filters.avs の中を見てみると、VirtualDub のプラグインを AviSynth で使用する際に必要となる関数や(グローバル)変数が定義されています。このため、vdub_filters.avs を利用すれば、少しの設定*1インポートだけで、VirtualDub のフィルタを使えるようになります。

ただし、vdub_filters.avs にすべての VirtualDub プラグインが収録されているわけではありません。vdub_filters.avs の中に使用したいフィルタ用の関数が含まれている場合にのみ、こちらの方法を利用するとよいでしょう。収録されているプラグインについては、vdub_filters.avs に同梱されている scripts.txt にリストアップされていますので、そちらを参考にしてください。

vdub_filters.avs の入手

以下のいずれかのページから入手可能です。avisynth.nl からの入手する場合は、自分でテキストエディタにコピーして、avs ファイルとして保存する必要があります。

簡易版 simplified_versions.avs

vdub_filters.avs の簡易版の simplified_versions.avs もあります。vdub_filters.avs に比べて、収録されている関数の数が少なくなっています。

vdub_filters.avs の使用手順

1. VirtualDub プラグインディレクトリの指定

vdub_filters.avs をメモ帳で開き、VirtualDub_plugin_directory をあなたの VirtualDub プラグイン用ディレクトリのパスに変更します。VirtualDub のプラグイン用ディレクトリは、VirtualDub をインストールしたディレクトリにある plugins フォルダにあたります。

########################################################
# Change VirtualDub_plugin_directory below to point to #
# the directory containing your VirtualDub plugins.    #
########################################################

global VirtualDub_plugin_directory = "c:\Program Files\virtualdub\plugins" # <- ここを変更

2. vdub_filters.avs のインポート

メインの AVS ファイル(VirtualDub のプラグインを使用したい AVS ファイル)に vdub_filters.avs をインポートします。その際、Import 関数を記述する位置は、VirtualDub のプラグインを使用する行よりも前にします。vdub_filters.avs がメインの AVS ファイルと異なるディレクトリにある場合は、パス指定も忘れないでください。

Import("vdub_filters.avs")

3.使用したいプラグイン用の関数を呼び出す

vdub_filters.avs をよく見ると、example から始まるコメント行が何度も出てくるのがわかります。これは、それぞれの VirtualDub のプラグインを呼び出すときに使用する関数の使用例です(下のスクリプトは、2D Cleaner by Jim Casaburi, v0.6b の場合)。

# example:  
# ConvertToRGB() 
# VD_2DCleaner(75, 1) 
# ConvertToYUY2() 

これらの使用例を参考にして、使用したいプラグイン用の関数を呼び出すとよいでしょう。これで VirtualDub のフィルタを AviSynth のフィルタと同様に使用することができます。

なお、各関数のパラメータの意味については、vdub_filters.avs や各 VirtualDub プラグインのマニュアルを参考にしてください。また、上述のように VirtualDub のフィルタプラグインは RGB32 で動作するため、ビデオクリップが RGB32 ではない場合は、前もって ConvertToRGB32 フィルタを使って RGB32 に変換しておく必要があります。

自分で VirtualDub プラグイン用の関数を定義する方法

vdub_filters.avs に含まれていないプラグインを利用したい場合、自分で LoadVirtualDubPlugin の指定を行う必要があります。このとき問題になるのは、VirtualDub プラグイン用の関数のパラメータです。関数の名前は任意で好きな名前を付けることができますが、その関数がどのようなパラメータが持ち、どのような順番で指定したらいいのかは自分で調べる必要があります。

なお、以下の方法は、Doom9's Forum - Possibly a stupid Avisynth/VDub question re filters における neuron2 氏の投稿を参考にしました。

1. VirtualDub で使用したいプラグインの設定を行う

vdub_filters_menu.png

まず、ソースファイルを VirtualDub で開き、メニューから Video > Filters... をクリックします。Filters は、Video メニューで Full processing mode が選択されているときのみ有効です。ほかのモードが選択されている場合は、Full processing mode に変更してください。

vdub_filters_add.png

Filters ウィンドウが開きますので、使用したい VirtualDub プラグインの設定を行ってください。VirtualDub フィルタは、以下のような手順で設定します(例として vdub_filters.avs にも収録されている 2D Cleaner Optimized Version 0.9 を使用しています):

  1. Filters ウィンドウの [Add] ボタンをクリック。
  2. Add Filter ウィンドウのフィルタ一覧から、使用したいプラグインの名前を選択して [OK] ボタンをクリック。
    vdub_filters_select.png
  3. 選択したプラグインの設定画面が開くので、設定を行い [OK] ボタンをクリック。
    vdub_filters_2dcleaneropt.png
  4. さらに別のプラグインを使用したい場合は、上記 1 〜 3 の手順を繰り返し。
  5. Filters ウィンドウの [OK] ボタンをクリック。
vdub_save_vcf.png

プラグインの設定が完了したら、メニューの File > Save processing settings... から VirtualDub configuration ファイル(vcf ファイル)を保存します。

2. vcf ファイルをメモ帳で開く

1 で保存した vcf ファイルをメモ帳で開いてみてください。すると、次のような記述のある行が見つかると思います。

vdub_vcf_example1.png

これは、2D Cleaner Optimized Version 0.9 をデフォルト値のまま追加した vcf ファイルです。上の行(VirtualDub.video.filters.Add("2d cleaner optimized (0.9)");)が追加されたフィルタ(プラグイン)の名前、下の行(VirtualDub.video.filters.instance[0].Config(0, 10, 2, 2);)がその設定のようです。そして、どうやら「Config(0, 10, 2, 2)」の部分がプラグインのパラメータに渡される値である、と推測することができます。しかしこれだけでは、すべてのパラメータの意味や順番まではわかりません。このようなときは、ためしに別の設定値で vcf ファイルを作成してみるといいでしょう。

vdub_vcf_example2.png

こちらは interlaced video のチェックボックスをオンにしたときの vcf ファイルです。Config の括弧内の 1 つ目の値が 0 から 1 に変更されています。このことから、Config の括弧内の 1 つ目が interlaced video 用のパラメータで、そして 0 ならチェックボックスをオフ、1 ならチェックボックスをオンにしたのと同じになると判断することができます。他のパラメータについても同様に調べると、2 つ目のパラメータが threshold for blending、3 つ目と 4 つ目が Radii around source pixel の X と Y であることがわかります*2

まとめると、2D Cleaner Optimized Version 0.9 を AviSynth で使用する場合に必要なパラメータとその順番は、以下のようになります。

  • 1 つ目のパラメータ
    • interlaced video。0: オフ、1: オン。
  • 2 つ目のパラメータ
    • threshold for blending。
  • 3 つ目のパラメータ
    • Radii around source pixel X。
  • 4 つ目のパラメータ
    • Radii around source pixel Y。

3. LoadVirtualDubPlugin 関数の指定と関数の呼び出し

AviSynth で VirtualDub プラグインを利用するには、LoadVirtualDubPlugin という AviSynth 組み込みの関数を使用します。LoadVirtualDubPlugin の書式は、以下のとおりです(AviSynthPlugins より。詳しくは、AviSynthPlugins を参照)。

  • 書式
    LoadVirtualDubPlugin(string filename, string filtername, int preroll)
    
  • 引数
    • filename: vdf ファイル(VirtualDub プラグイン)のパス。
    • filtername: filename で指定したプラグインを AviSynth で呼び出すときに使用する関数。名前はユーザーが任意で設定可能*3
    • preroll: 前のフレームに出力を依存するフィルタ向けに、少なくともそのフィルタが前処理(バッファをいっぱいにする/内部変数の更新)に必要とするフレーム数を設定するべき。

具体的には、次のように指定します。

# LoadVirtualDubPlugin 関数の定義
LoadVirtualDubPlugin("C:\VirtualDub\plugins\2dcleanopt_k7.vdf", "Vdub_2DCleanerOpt")

1 つ目の引数に 2dcleanopt_k7.vdf(または 2dcleanopt_p3.vdf)のパスを指定し、2 つ目の引数で 2D Cleaner Optimized Version 0.9 を AviSynth 内で呼び出す時に使用する関数の名前を指定しています。Vdub_2DCleanerOpt という関数の名前は、私が勝手に名付けたものです。他の名前でもかまいません。preroll パラメータは省略しています。

次に Vdub_2DCleanerOpt 関数を呼び出します。Vdub_2DCleanerOpt 関数のパラメータは、「2. vcf ファイルをメモ帳で開く」で調べたとおりです。

Vdub_2DCleanerOpt(int arg1, int arg2, int arg3, int arg4)

仮に 4 つのパラメータを順に arg1 〜 arg4 とすると、arg1 が interlaced video、arg2 が threshold for blending、arg3 が Radii around source pixel X、arg4 が Radii around source pixel Y となります。

# LoadVirtualDubPlugin 関数の定義
LoadVirtualDubPlugin("C:\VirtualDub\plugins\2dcleanopt_k7.vdf", "Vdub_2DCleanerOpt")
# Vdub_2DCleanerOpt 関数の使用例
Vdub_2DCleanerOpt(0, 10, 2, 2)

こちらが使用例です。これで 2D Cleaner Optimized Version 0.9 を、AviSynth の中で利用することが可能になります。ただし上述のように、もしクリップが RGB32 でない場合は、あらかじめ ConvertToRGB32 フィルタを使って RGB32 に変換する必要があります。

備考: Wrapper 関数*4の作成

上記の手順で vdub_filters.avs に含まれていない関数も利用可能になります。しかし、実際に使用する場合には、デフォルト値が設定されていた方が便利かもしれません。また、VirtualDub のプラグインディレクトリは決まっているので、複数のプラグインを利用するようなら、あらかじめ変数で指定しておいてもいいでしょう。

以下に、デフォルト値を埋め込んだ Vdub_2DCleanerOpt 関数の例を示します。

function Vdub_2DCleanerOpt(clip input, bool "interlaced", int "threshold", int "radiiX", int "radiiY")
{
    # default values
    #interlaced = default(interlaced, 0)
    interlaced = default(interlaced, false)
    interlaced = (interlaced == true) ? 1 : 0 # convert boolean value to 0/1 
    threshold = default(threshold, 10)
    radiiX = default(radiiX, 2)
    radiiY = default(radiiX, 2)
    
    # Define LoadVirtualDubPlugin function
    LoadVirtualDubPlugin(VirtualDub_plugin_directory+"\2dcleanopt_k7.vdf", "_Vdub_2DCleanerOpt")
    #LoadVirtualDubPlugin(VirtualDub_plugin_directory+"\2dcleanopt_p3.vdf", "_Vdub_2DCleanerOpt")
    
    # Apply _Vdub_2DCleanerOpt function to input clip
    output = input._Vdub_2DCleanerOpt(interlaced, threshold, radiiX, radiiY)
    
    # return output clip
    return output
}

VirtualDub のプラグインディレクトリは、変数 VirtualDub_plugin_directory で指定しているので、このまま vdub_filters.avs に追加して使用することも可能です*5。じつは vdub_filters.avs が行っているのも、このような関数化と VirtualDub プラグインディレクトリの global 変数指定です。

参考:


*1 VirtualDub プラグインディレクトリの指定が必要です。
*2 Show sharp edges については、オンでもオフでも vcf ファイルには違いが生じませんでした。よって、AviSynth から 2D Cleaner Optimized Version 0.9 を呼び出す場合、Show sharp edges に関する設定は行いものと考えられます。vdub_filters.avs にも、Show sharp edges 関連の項目は見当たりません。
*3 ユーザー定義関数同様、半角英数字またはアンダースコア(_)が使用可能(ただし、数字から始まる名前は不可)。
*4 参考: 教えて!goo ラッパーって何なんでしょう・・・?
*5 2D Cleaner Optimized Version 0.9 は、すでに vdub_filters.avs に含まれています。ただし、関数名が異なるため、追加しても問題は生じません。

最終更新日時: 2014-03-12 (水) 23:41:01 (3696d)