AvisynthMTは、AviSynthの各種プラグインをマルチスレッド環境で作動させてくれるプラグインです。クアッドコア以上で動画変換する際やCPUにまだ余力がある場合は、かなりの速度アップが見込めます。(デュアルコアでは多分そんなに変わりません)

当環境での具体的な数値を上げると
  CPU:Core i7 920(3.7Ghz HT OFF)で
  地デジTSファイル(1440X1080:4分30秒)を
  XivD(960X544)にリサイズ、24FPS化してエンコードする場合

VirtualDubMod+AviSynth(IT、Lanczos使用)
  MTなし→あり: 35~40FPS→55~70FPS
             
(161sec→108sec)
VirtualDubMod+AviSynth(IT、Bicubic使用)
  MTなし→あり: 38~45FPS→55~75FPS
             (144sec→104sec)

と、4~5割程度のスピードアップ。
CPU使用率も40~70%から50~90%へと効率アップ。あと1~2個なら軽いフィルタを咬ませられるし、エンコーダー自体の設定をさらに高圧縮にシフトしても殆ど速度は落ちなさそうです。

HT ONにすると もっと速くなるんじゃないの?
と思ってしまいますが、MTプラグインは現状HTには対応していないそうで、かなりの確率で強制終了してしまいます。

ダウンロード

AvisynthMT
上記リンク中の「MT (MultiThreading in avisynth) version 0.7. Contains MT and amodified multithreaded version of avisynth 2.5.7 」がAviSynthマルチスレッド化プラグインです。2.5.7用となっていますが、現在最新である2.5.8でも作動しました。

インストール

  1. ダウンロードしたファイル「MT.dll」をAviSynthプラグインフォルダへ突っ込む
    (avs内で呼び出して使う事も可能)
  2. ダウンロードしたファイル「avisynth.dll」をwindows\system32等、オリジナルのavisynth.dllがインストールされているフォルダへ移動させる。
    マルチスレッドdll
    ▲万一AviSynthが起動しなくなった時のため、オリジナルDLLはバックアップしておいた方が良い。 

以上でインストールおしまい。
あとはavsスクリプトを各種フィルタがマルチスレッドで動いてくれるよう、チョコチョコっと書き換えるだけです。

スポンサー リンク

使い方

詳細な使い方、解説についてはAviSynth Wiki MTサポートページに掲載されているので、そちらを参考に。ここではごくごく簡単に、私の使っているスクリプトを紹介。
殆どフィルタを使わず、高速にエンコするのが私のスタイルです。

ちなみにMT.dllでAviSynthの各種フィルタを使用する場合、「SetMTModeを使う方法」と「mtを使う方法」があります。

パターン1:SetMTModeを使った場合

MPEG2Source("X:\sample\sample.d2v")
SetMTMode(2,0) #(2=モード2、0=スレッド検知オート)
           #Auto24FPS()
IT(fps = 24, ref = "TOP", blend = false)
           #AssumeTFF()
           #DoubleWeave().a60224(fast=true,blur_rate=0.0,x1=128,x2=128,y1=64,y2=64)
LanczosResize(960,540)
SetMTMode(6)#(6=モード6:低速だけど3DNR系も使える)
FFT3DGPU(sigma=2,beta=1,plane=0,bw=16,bh=16,ow=8,oh=8,bt=3,mode=1, sharpen=0,interlaced=false,NVPerf=false,wintype=1,precision=0)
return last

フレームごとにスレッド別にして処理します。
様々なフィルタがそのまま使えて便利です。
フィルタに応じてSetMTModeを1~6で使い分ける必要があります。
(3DNRやGPUプラグインは低速なモード6にしなければ作動しない場合が多い)

注意1
逆テレシネプラグインは、スレッドごとのフレームレートの整合性がとれないと エンコーダーごと不正終了してしまうみたいです。時々解除残しを発生するAuto24やa60224のFastモードではVDMごと強制終了が起きました。

注意2
GPUプラグイン(本来MTプラグインにFFT3DGPUプラグインは使えないです)が律速となるような高速スクリプトを組むと、エンコーダーの作動が非常に不安定になります。画像が乱れたり、最悪の場合VDM強制終了、PC再起動するまでGPU使用不能な事態に。
一つ重いフィルタを挟むと、不思議と安定しました。

パターン2:mtを使った場合


MPEG2Source("f:\00-2009-0215test\jpn-incre.d2v")
           #mt("""Auto24FPS()""",4,4)
mt("""IT(fps = 24, ref = "TOP", blend = false)""",4,2) #4=スレッド数、2=ゴミ消し調整
           #mt("AssumeTFF()")
           #mt("DoubleWeave().a60224(fast=true,blur_rate=0.0,x1=180,x2=180,y1=0,y2=00)")
mt("LanczosResize(960,last.height)",4)
mt("LanczosResize(last.width,544)",4,splitvertical=true)
FFT3DGPU(sigma=2,beta=1,plane=0,bw=16,bh=16,ow=8,oh=8,bt=3,mode=1, sharpen=0,interlaced=false,NVPerf=false,wintype=1,precision=0)
return last

画面を縦または横に分割してスレッド別に処理します。
画面を分割して修理するため、リサイズフィルタは2段階に分ける必要があります。

こちらの方法では逆テレシネプラグインに何を使用しても途中で変換が止まる事はありませんでした。

注意1
各フィルタ、画面を分割した境界にゴミが発生する事があります。
パラメータを調整してゴミが出ないようにする必要があります。

注意2
FFT3DGPUプラグインはmtプラグインに組み込めません。
が、NVIDIA 9600GTクラスを使っていると、殆ど律速にならないのでこれでも十分高速です。

 

どっちが使いやすいかは、人それぞれ。スクリプトによって変わってきます。
私のような軽いフィルタばかり使用して高速にエンコードしたい人は、
パターン2:mtを使うほうが安全みたいです。
パターン1:SetMTModeは高速に作動するフィルタばかり詰め込んで走らせると、かなりの確率で途中でエンコードが止まります(´Д`;)

最後に

以前からAviSynthをマルチスレッド化するプラグインがある事は知っていたのですが、デュアルコア時代はその恩恵も少なく(AviSynthとエンコーダーでバランス良くCPUを使ってくれていた為)手を出していませんでした。

しかしクアッドコア・8スレッドともなるとAviSynth経由でエンコードを行うと、CPUパワーは余っているのに「様々なプラグイン・フィルタが律速となり」変換速度が上がりません。

現状からもう少し高速に出来ないものかとマルチスレッド化プラグインに手を出したのですが、大正解。
かなりの効果を発揮してくれました。万能という訳ではありませんが、これは使えます。

リサイズ、24FPS化にマルチスレッドが使える事自体素晴らしい。
私の中で再びVDM+AviSynthは急上昇中です(´∀`)ノ