AviSynth+にはマルチスレッドで動作できる開発版が存在します。フィルタを多く使う場合、高速化するかもしれないので、興味がある方は導入してみてはいかがでしょう?
更新履歴
2016/7/25 内容をr1847からr2085に更新
2017/2/23 SetFilterMTMode変更
2018/4/10 内容をr2664に更新
最近更新が激しいようなので、内容がすぐ陳腐化してしまうかもしれません。ご注意ください。16bit/32bit等他の新機能についてはもう少し落ち着いてからにします。。。
AviSynth+開発版のインストール
基本的にpinterf氏のGithubを確認すれば最新版は追っかけられると思います
ダウンロード
Githubにて公開されています。
with-vc-redistとなっているものは、おそらくVisual Studio 2017のライブラリ同梱版と思われます。インストールしてない方はそちらをDLしましょう。
MT-filesonlyとなっているものはバイナリのみでインストーラーがありません。古いバージョンから手動でアップデートしたい方向けです。
インストール
インストーラーの方は安定版と同じように指示に従ってすすめるだけでよいでしょう。
以下はMT-filesonly向けの解説
64bitOSを使っている方は、AviSynth.dllを
32bit版(x86)は “C:\Windows\SysWOW64” に、
64bit版(x64)は “C:\Windows\System32” に、
それぞれ移動(上書き)してください。SysWOW64が32bit、System32が64bitです。逆にしないように注意してくださいね
32bitOSを使っている方はAviSynth.dllを”C:\Windows\System32″に移動(上書き)してください
DirectShowSource.dllは、32bit版はPlugins+フォルダに、64bit版はPlugins64+フォルダにそれぞれ上書きしてください
他のプラグインの差し替え
Chikuzenさんが公開されていたプラグインや、nnedi3を差し替える必要があるかもしれません。詳しくはChikuzenさんのブログをご覧ください
外部リンク : Ch’s barn – いろいろ更新
nnedi3については、Doom9の該当スレッドをご覧ください
AviSynth.dllを差し替えたあとに、AviSynthが一切使えない(AvsPmodが開きすらしない)場合、プラグインが原因のようです。DirectShowSourceも古いのをそのまま使おうとすると起動できないようです
AviSynth+開発版の機能
開発版では様々な機能拡張が実装されています
- マルチスレッドモード搭載
- スクリプト関数拡張
- 内蔵フィルタの一部高ビット深度対応
主なところはこんなところでしょうか。ひとまずマルチスレッドモードに絞って解説します
マルチスレッドで動かす
AviSynth2.6MTなど、以前に存在したAviSynthのマルチスレッド版では、MT()やSetMTMode()を使ってマルチスレッドで動かしていましたが、AviSynth+ではSetFilterMTMode()を使って、冒頭にあらかじめ使うフィルタのMTモードを宣言することでマルチスレッドの設定をします
MTモードの宣言
宣言は
1 |
SetFilterMode(使うフィルタ, 1 or 2 or 3 or 4) |
または
1 |
SetFilterMode(使うフィルタ, MT_NICE_FILTER or MT_MULTI_INSTANCE or MT_SERIALIZED or MT_SPECIAL_MT) |
このように行います。1 = MT_NICE_FILTER, 2 = MT_MULTI_INSTANCE, 3 = MT_SERIALIZED, 4 = MT_SPECIAL_MT です
例えばavsの冒頭に
1 |
SetFilterMTMode("removegrain", 1) |
と記述しておけばこのスクリプト内でのremovegrain()はすべてモード1(MT_NICE_FILTER)で動いてくれます
MTモードの設定のみを記述したavsiファイルを用意しておけば、それをインポートするだけで設定が完了します
以前のSetMTModeと違ってスクリプト内でころころモードを変える必要がないのでお手軽ですし、外部スクリプトも書き直すことなく簡単にMTで動かせます。管理も楽で非常に便利です
ちなみに
1 |
SetFilterMTMode("DEFAULT_MT_MODE", 3) |
このように記述すると、全てのフィルタがモード3(MT_SERIALIZED)に設定されます
1 2 |
SetFilterMTMode("DEFAULT_MT_MODE", 3) SetFilterMTMode("removegrain", 1) |
このように記述すると、removegrainはモード1、その他の関数はモード2に設定されます
なお、一部のプラグイン(さきほど紹介したDoom9のnnedi3など)は宣言しなくても自動で登録してくれるようです
MTモードの確認
気になるのはたくさんあるフィルタのそれぞれの正しいモードはいくつなの?ということですよね。AviSynth.nl から飛べるPadにまとめられています。Help filling MT modes のところにある、”AviSynth+ MT modes”をクリックして確認してください。“here”の方は編集したい人向けなので、ただ見るだけの人は飛ばないように!
条件によって最適なものが変わるものがあるので、Pad内に注釈があるものはよく読んでおきましょう。本体やプラグインが更新されると最適なモードが変わる場合があります。更新する場合はチェックしましょう。例えば、Ditherだったら、1.24までと1.25以降では設定が変わります。古いのを使っている人はこれを機会に更新しておきましょう
MTモードの有効化
SetFilterMTModeを設定するだけでは、まだマルチスレッドで動作しません。 return last の直前に Prefetch(n) を入れることで有効になります。nはスレッド数のようですが、CPUのスレッド数の半分程度にすると良いようです
サンプル
サンプルスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# Sample1 SetMemoryMax(2048) Import("D:\App\AviSynth+\avsi\LSFmod.v1.9.avsi") SetFilterMTMode("LWLibavVideoSource", MT_SERIALIZED) SetFilterMTMode("LWLibavAudioSource", MT_SERIALIZED) SetFilterMTMode("removegrain", MT_NICE_FILTER) SetFilterMTMode("repair", MT_NICE_FILTER) SetFilterMTMode("verticalcleaner", MT_NICE_FILTER) SetFilterMTMode("clense", MT_NICE_FILTER) SetFilterMTMode("mt_invert", MT_NICE_FILTER) SetFilterMTMode("mt_binarize", MT_NICE_FILTER) SetFilterMTMode("mt_inflate", MT_NICE_FILTER) SetFilterMTMode("mt_deflate", MT_NICE_FILTER) SetFilterMTMode("mt_inpand", MT_NICE_FILTER) SetFilterMTMode("mt_expand", MT_NICE_FILTER) SetFilterMTMode("mt_lut", MT_NICE_FILTER) SetFilterMTMode("mt_lutxy", MT_NICE_FILTER) SetFilterMTMode("mt_lutxyz", MT_NICE_FILTER) SetFilterMTMode("mt_luts", MT_NICE_FILTER) SetFilterMTMode("mt_lutf", MT_NICE_FILTER) SetFilterMTMode("mt_lutsx", MT_NICE_FILTER) SetFilterMTMode("mt_lutspa", MT_NICE_FILTER) SetFilterMTMode("mt_merge", MT_NICE_FILTER) SetFilterMTMode("mt_logic", MT_NICE_FILTER) SetFilterMTMode("mt_convolution", MT_NICE_FILTER) SetFilterMTMode("mt_mappedblur", MT_NICE_FILTER) SetFilterMTMode("mt_makediff", MT_NICE_FILTER) SetFilterMTMode("mt_average", MT_NICE_FILTER) SetFilterMTMode("mt_adddiff", MT_NICE_FILTER) SetFilterMTMode("mt_clamp", MT_NICE_FILTER) SetFilterMTMode("mt_motion", MT_NICE_FILTER) SetFilterMTMode("mt_edge", MT_NICE_FILTER) SetFilterMTMode("mt_hysteresis", MT_NICE_FILTER) SetFilterMTMode("TDeint", MT_MULTI_INSTANCE) SetFilterMTMode("TFM", MT_MULTI_INSTANCE) SetFilterMTMode("TDecimate", MT_MULTI_INSTANCE) video = LWLibavVideoSource("_file_.ts") audio = LWLibavAudioSource("_file_.ts", av_sync = true ) AudioDub(video, audio) AssumeTFF() TIVTC24P2() LSFmod(defaults="slow", strength=40, dest_x=1280, dest_y=720) Prefetch(4) return last function TIVTC24P2(clip clip){ Deinted=clip.TDeint(order=-1,field=-1,edeint=clip.nnedi3(field=-1)) clip = clip.TFM(mode=6,order=-1,PP=7,slow=2,mChroma=true,clip2=Deinted) clip = clip.TDecimate(mode=1) return clip } |
MTの設定を別のファイルにわける場合は
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# MT.avsi SetFilterMTMode("LWLibavVideoSource", MT_SERIALIZED) SetFilterMTMode("LWLibavAudioSource", MT_SERIALIZED) SetFilterMTMode("removegrain", MT_NICE_FILTER) SetFilterMTMode("repair", MT_NICE_FILTER) SetFilterMTMode("verticalcleaner", MT_NICE_FILTER) SetFilterMTMode("clense", MT_NICE_FILTER) SetFilterMTMode("mt_invert", MT_NICE_FILTER) SetFilterMTMode("mt_binarize", MT_NICE_FILTER) SetFilterMTMode("mt_inflate", MT_NICE_FILTER) SetFilterMTMode("mt_deflate", MT_NICE_FILTER) SetFilterMTMode("mt_inpand", MT_NICE_FILTER) SetFilterMTMode("mt_expand", MT_NICE_FILTER) SetFilterMTMode("mt_lut", MT_NICE_FILTER) SetFilterMTMode("mt_lutxy", MT_NICE_FILTER) SetFilterMTMode("mt_lutxyz", MT_NICE_FILTER) SetFilterMTMode("mt_luts", MT_NICE_FILTER) SetFilterMTMode("mt_lutf", MT_NICE_FILTER) SetFilterMTMode("mt_lutsx", MT_NICE_FILTER) SetFilterMTMode("mt_lutspa", MT_NICE_FILTER) SetFilterMTMode("mt_merge", MT_NICE_FILTER) SetFilterMTMode("mt_logic", MT_NICE_FILTER) SetFilterMTMode("mt_convolution", MT_NICE_FILTER) SetFilterMTMode("mt_mappedblur", MT_NICE_FILTER) SetFilterMTMode("mt_makediff", MT_NICE_FILTER) SetFilterMTMode("mt_average", MT_NICE_FILTER) SetFilterMTMode("mt_adddiff", MT_NICE_FILTER) SetFilterMTMode("mt_clamp", MT_NICE_FILTER) SetFilterMTMode("mt_motion", MT_NICE_FILTER) SetFilterMTMode("mt_edge", MT_NICE_FILTER) SetFilterMTMode("mt_hysteresis", MT_NICE_FILTER) SetFilterMTMode("TDeint", MT_MULTI_INSTANCE) SetFilterMTMode("TFM", MT_MULTI_INSTANCE) SetFilterMTMode("TDecimate", MT_MULTI_INSTANCE) |
このようなavsiファイルを用意しておいて
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# Sample2 SetMemoryMax(2048) Import("D:\App\AviSynth+\avsi\LSFmod.v1.9.avsi") # MTの設定読み込み Import("D:\App\AviSynth+\avsi\MT.avsi") video = LWLibavVideoSource("_file_.ts") audio = LWLibavAudioSource("_file_.ts", av_sync = true ) AudioDub(video, audio) AssumeTFF() TIVTC24P2() LSFmod(defaults="slow", strength=40, dest_x=1280, dest_y=720) Prefetch(4) return last function TIVTC24P2(clip clip){ Deinted=clip.TDeint(order=-1,field=-1,edeint=clip.nnedi3(field=-1)) clip = clip.TFM(mode=6,order=-1,PP=7,slow=2,mChroma=true,clip2=Deinted) clip = clip.TDecimate(mode=1) return clip } |
インポートすることでMTで動かすことができます。Sample1とSample2は同じ動きをするようになります。これでTIVTC24P2や外部スクリプトのLSFmodもMTで動くようになります
今の私のSetFilterMTMode
かなりうさんくさいところが多いので絶対に信用しないで下さい。前述のpadでも訂正が入ることがあるようなので最適なモードを見つけるのは難しそうです。速いけどクラッシュしたり、一部乱れたりすることもあるようなので速さで信用しないようにしましょう
masktools2, rgtools, nnedi3など、自動登録してくれるバージョンを使っているものは宣言していません
古いものだと自動登録してくれなかったり、最適化されていなかったりするので、プラグインはしっかり新しいものを探すようにしましょう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# 2018/4/10 # -- Core -- SetFilterMTMode("DEFAULT_MT_MODE", MT_SERIALIZED) # -- Source -- SetFilterMTMode("MPEG2source", MT_NICE_FILTER) SetFilterMTMode("DGsourceIM", MT_SERIALIZED) SetFilterMTMode("LWLibavVideoSource", MT_SERIALIZED) SetFilterMTMode("LWLibavAudioSource", MT_SERIALIZED) # -- Dither -- SetFilterMTMode("DitherPost", MT_NICE_FILTER) SetFilterMTMode("SmoothGrad", MT_NICE_FILTER) SetFilterMTMode("Dither_box_filter16", MT_NICE_FILTER) SetFilterMTMode("Dither_bilateral16", MT_NICE_FILTER) SetFilterMTMode("Dither_limit_dif16", MT_NICE_FILTER) SetFilterMTMode("Dither_resize16", MT_NICE_FILTER) SetFilterMTMode("Dither_out", MT_NICE_FILTER) SetFilterMTMode("Dither_removegrain16",MT_NICE_FILTER) SetFilterMTMode("Dither_repair16", MT_NICE_FILTER) SetFilterMTMode("Dither_median16", MT_NICE_FILTER) SetFilterMTMode("Dither_add16", MT_NICE_FILTER) SetFilterMTMode("Dither_sub16", MT_NICE_FILTER) SetFilterMTMode("Dither_max_dif16", MT_NICE_FILTER) SetFilterMTMode("Dither_merge16", MT_NICE_FILTER) SetFilterMTMode("f3kdb", MT_MULTI_INSTANCE) # -- SmoothAdjust -- SetFilterMTMode("SmoothLevels", MT_NICE_FILTER) SetFilterMTMode("SmoothTweak", MT_NICE_FILTER) SetFilterMTMode("SmoothCurve", MT_NICE_FILTER) SetFilterMTMode("SmoothCustom", MT_NICE_FILTER) # -- DeInterlace & IT -- SetFilterMTMode("TDeint", MT_MULTI_INSTANCE) SetFilterMTMode("Vinverse", MT_MULTI_INSTANCE) # -- DeCross & DeDot -- SetFilterMTMode("Tcomb", MT_SERIALIZED) SetFilterMTMode("DeDot", MT_SERIALIZED) SetFilterMTMode("DeCross", MT_SERIALIZED) # -- DeNoise -- SetFilterMTMode("dfttest", MT_SERIALIZED) SetFilterMTMode("TNLMeans", MT_MULTI_INSTANCE) SetFilterMTMode("KNLMeansCL", MT_MULTI_INSTANCE) SetFilterMTMode("MosquitoNR", MT_SERIALIZED) SetFilterMTMode("Deblock", MT_NICE_FILTER) # -- Logo(?) -- SetFilterMTMode("EraseLOGO", MT_MULTI_INSTANCE) SetFilterMTMode("AddLOGO", MT_MULTI_INSTANCE) SetFilterMTMode("EraseLogoMod", MT_MULTI_INSTANCE) # -- avstp -- if (FunctionExists("avstp_set_threads")) { avstp_set_threads(0, 1) } |
コメント