このドキュメントは rev 1194以降に対応しています。
AviSynthはスクリプト言語の一種でノンリニア編集のための画像フィルタを集めたものです。詳しくはAviSynth Wikiを参照して下さい。 ffdshowの画像フィルタ設定で可能であるのと同様、AviSynthの画像フィルタを組み合わせてフィルタ・チェーンを作ることができます。 それはffdshowの画像フィルタ群よりさらに強力で魅力的なものですが、GUIが付属しておらずメディア・プレーヤーで動画を見るのにあまり適しているとは言えません。
ffdshowのAviSynthフィルタはほとんどのAviSynth内蔵フィルタと外部プラグインをリアルタイムでビデオ再生に用いることができます。しかしもちろんいくらかの制限があり、それについてはこのページの下のほう "互換性"をお読みください。
まず最初にAviSynthをインストールしておく必要があります。まだお済でなければAviSynthのホームページ、英語 または直接AviSynth 2.5 ダウンロードページ(SourceForge) から最新版をダウンロードしてインストールしてください。
他のフィルタやスクリプトが必要になることもあります。AviSynth WikiとAviSynthと同時にインストールされたドキュメントをご一読されることをおすすめします。 内蔵フィルタと外部プラグインの包括的なリストと説明があります。スクリプト、フィルタ、AviSynth全般についてさらに情報をお求めなら、 Doom9.orgのAviSynthユーザー・フォーラム・英語 または Doom9.orgのAviSynth開発フォーラム・英語 をお読みください。
ffdshowのAviSynthフィルタ設定のページはビデオに対して適用されるAviSynthスクリプトを記載するための大きなテキストボックスといくつかの追加のオプションから成り立っています。
チェックするとffdshowからの入力画像をAviSynthに取り入れる"ffdshow_source"というソースフィルタへの呼び出しがスクリプトの先頭に自動的に追加されます。
チェックしない場合、"ffdshow_source()"をスクリプト中のどこかに記載する必要があります。
DVDのようにインターレース(NTSC)のテレビで見ることを前提に作られたビデオは約30フレーム/秒(以下FPS)になっています。しかし、映画は通常約24フレームですから30フレームにするためには何か細工が必要です。 通常この目的で使用される方法は「3:2 プルダウン」または「テレシネ」と呼ばれ、4フレームに対して1フレーム(より正確には2つのフィールド、1フィールドは0.5フレーム)をオリジナルのフレームのフィールドを結合したり複製したりすることで作り上げて追加します。 PCのモニタ(プログレッシブ)で見た場合何の対策もとらなければくし状のアーチファクトがみられます(最近のビデオカードではたいていの場合これをうまく処理してくれます、しかしサンプルによってはうまくいかないケースもあります)。
ビデオ・ストリームのインターレースとフィールドリピートに関するフラグは無視されます。インターレース関連フラグとタイムスタンプを変更したくないときに、このオプションを選択してください。 主としてAviSynthでフレームを追加したり削除したりしない、または100%プログレッシブの場合になります。
ビデオ・ストリームがインターレースやフィールドリピートに関するフラグを持っているかはそのビデオ次第ですが、DVDや他のMPEG2ビデオは大抵持っています。
24FPSの素材をフレームを追加したり削除したりするスクリプトで扱うには、このオプションを使用してください。 ビデオ・ストリームのインターレース関連フラグに基づいて3:2 プルダウンを再現します。 これによりAviSynthはテレビと同じように確実に30FPSを等間隔のタイムスタンプで受け取ることができます。 というのは24FPS素材のDVDではフレームの持続時間が交互に変化する(33/50ms)のですが、AviSynthはフレームレートが一定でないとうまく処理することができません。 プルダウンを適用した後、元々の24FPSに戻すためにインターレース除去フィルタ、より望ましくはTIVTCかDecombのような逆テレシネ(IVTC)フィルタを使用することになります。
これはフラグが狂っていて(このフィルタなしには)ひどいくし状アーチファクトやぎこちない動きのためまともに見られないDVDを修正して見るのにも使えます。 また24/30FPSのハイブリッド素材を見るときにも大変有用です。 このオプションはインターレース関連フラグの存在下で作用しますのでプログレッシブの素材に対してそのままにしておいてかまいません。
このオプションは交互に変化するフレームの持続時間(24FPS素材のDVDでは33と50msの交互)を現在のフレームと一つ前のフレームの持続時間の平均とすることで平滑化します。 これにより、ハイブリッド素材でタイムスタンプを狂わせることなく(たとえばbobフィルタで)フレームを追加したり削除したりすることが出来ます(bobフィルタなどはフレームの持続時間が等間隔でないと動作しません)。 (フレームの持続時間が最初から等間隔である場合には当然そのままになります。)
スクリプトで使用するAviSynthフィルタのすべてがここに挙げられた色空間をすべて受け入れられるとは限らないので、 使用できない色空間のチェックを外しffdshowが必要に応じてチェックされた色空間のうちのどれかに変換するように指定することが出来ます。 もちろん、4つともチェックしておき色空間変換をスクリプトの中で行うことも出来ます。 色空間の変換は少々時間がかかり、画質も低下させますので最低限にしたいところです。
AviSynthのフィルタはその直前のフィルタに対しどのフレームを要求しても良いことになっています。すなわちランダム、ノンリニア・アクセスが許されています。 しかしffdshowでは上流のDirectShowフィルタやアプリケーションがffdshowに渡すフレームを決定するためランダム・アクセスは不可能です。
この問題にどうにか対処するためffdshowのAviSynthフィルタは前方および後方のフレームをユーザーが指定した枚数だけメモリに記憶(バッファ)しておくことができます。 AviSynthスクリプトがその範囲内でフレームを要求すれば正しく機能します。 もし要求されたフレームがバッファになければそれに最も近いフレームを返しますが、少なくともIVTCかインターレース解除フィルタにおいてはぎこちない動きになります。
もしうまくいかないときはバッファの数を調節する必要があります。 必要なバッファの数を調べるにはffdshowのオンスクリーンディスプレイ(OSD)を有効にし「AviSynthの情報」にチェックするか、「現在の値を使う」ボタンを押して2つの数字を直接設定してください。
もし反対にバッファ機能を完全に止めたいときは2つの数字に0を設定するか「バッファー 後方/前方」のチェックを外してください。
(AviSynthのフィルタがどのくらいの範囲のフレームを要求するかはしばしば自明でないことがあります。それは入力ビデオによっても変化します。 ですからあるスクリプトに対して最適な値が決まるまでには微調整が必要かもしれません。 最適な値はスクリプトによって異なります。)
大きなテキストボックスはAviSynthスクリプトを書くところです。saveボタンを使ってファイルに保存したり、loadボタンを使ってファイルから読み込むことが可能です。
このダイアログに大きなスクリプトを書くのはあまり快適ではありませんのでスクリプトを関数として記載しAVSIファイルとして保存して(またはImport()を使って手動でインポートして)その関数をffdshowから呼び出すだけにすることも出来ます。
グローバル変数 ffdshow_dar_x と ffdshow_dar_y は入力ビデオのDAR (display aspect ratio)に設定されます(すなわち4:3のビデオなら4と3)。 また出力の新しいアスペクト比を設定するのに用いることもできます。 ただしDVD再生時にはMedia Player Classicなどいくつかのメディアプレイヤーはこれらの値を無視しDVD navigator (DirectShowフィルタ)にアスペクト比を問い合わせるため、おかしな結果になることがあります。
AviSynthのインストールが成功したかを確かめるための非常に簡単なスクリプトは単に:
Info()
現在のフレームについての基本的なデータをビデオに重ねて表示します。
TIVTCを使ったプルダウン除去のサンプル:
TFM(order=1,chroma=false) TDecimate(mode=1,hybrid=1,conCycle=1,chroma=false)
(必ず「プルダウンを適用する」を選択し「バッファー 後方/前方」を0と12にそれぞれ設定してください。AviSynthのプラグインフォルダにTIVTCを解凍しておく必要があります。)
上のスクリプトを拡張し800x600の領域に4:3または16:9(左右を少し切ります)でリサイズして出力するようにしたサンプル:
function Resize_16_9(v) { return v.LanczosResize(800,480,22,0,676,480).AddBorders(0,60,0,60) } function Resize_4_3(v) { return v.LanczosResize(800,600) } TFM(order=1,chroma=false) TDecimate(mode=1,hybrid=1,conCycle=1,chroma=false) ar=float(ffdshow_dar_x)/float(ffdshow_dar_y) diff=ar-1.5555 abs(abs(diff)-0.2222) > 0.05 ? last : \ (diff >= 0 \ ? last.Resize_16_9 \ : last.Resize_4_3) ffdshow_dar_x=4 ffdshow_dar_Y=3
ほとんどのAviSynthフィルタをffdshowで使えるはずです。 ffdshowで使えないことが分かっているものはビデオの中で大きく順番を入れ替えるもの(Trimとか(Un-)AlignedSpliceを数フレーム以上にわたって適用する、またはReverse)です。 他のビデオファイルをロードするのもあまり使い物にならないでしょう。
もし意図せずにスクリプトでフレーム数をわずかに増減してしまった場合(例えばFadeIn()は末尾に1フレームを追加します)、多分シーク時におかしなことがおこります。 これを避けるためには5:4とか1:2のような(小さな分子と分母の)普通の比率になるようにフレームを追加したり削除したりすることです。
バッファーを無効にし、「3:2 プルダウン」を「プルダウンを行わない」に設定することにより以前のffdshowの動作をさせることが出来ます。 これは中間バッファへのフレーム転送を避けることになり多少パフォーマンスが良くなります。 しかし当然TIVTCのような現在のフレーム以外のフレームを要求するスクリプトは動作しなくなります。