久々に AviSynth+ のプラグインとスクリプトを見なおした結果……

Software
この記事は約19分で読めます。
この記事は最終更新日より 1 年以上経過しています。
画像やリンクが無効になっている可能性もあるのでご了承下さい。

はじめに

 AviSynth+ で使用しているプラグインは物によって更新頻度が低く、何年も前の物を使っていたりなんて事もあったりする。
 また、スクリプト内のパラメータもその時々の気分で変わってきたりもする。
 そんなもんで年に 2~3 回くらいやっているプラグインとスクリプトの見なおした結果、罠に掛かっていたかのような事実が分かった。
 問題を解決した事により、x265 による HEVC エンコード速度が 1.8 倍になったお話しである。

プラグインの更新チェック

 AviSynth+ で筆者が使用しているプラグインと MTMode の動作設定は次の通り。
 一部テストで使った物はコメントアウトして残していたりする。

SetFilterMTMode("DEFAULT_MT_MODE",         MT_SERIALIZED)

SetFilterMTMode("D3DVP",                   MT_MULTI_INSTANCE)
SetFilterMTMode("Deblock",                 MT_NICE_FILTER)
SetFilterMTMode("EraseLOGO",               MT_MULTI_INSTANCE)
SetFilterMTMode("FFT3dGPU",                MT_SERIALIZED)
SetFilterMTMode("FluxSmoothST",            MT_SERIALIZED)
SetFilterMTMode("KNLMeansCL",              MT_MULTI_INSTANCE)
SetFilterMTMode("MPEG2Source",             MT_NICE_FILTER)
SetFilterMTMode("MipSmooth",               MT_SERIALIZED)
SetFilterMTMode("TDecimate",               MT_SERIALIZED)
SetFilterMTMode("TDeint",                  MT_MULTI_INSTANCE)
SetFilterMTMode("TFM",                     MT_MULTI_INSTANCE)
SetFilterMTMode("UnsharpMask",             MT_MULTI_INSTANCE)
SetFilterMTMode("aWarpSharp2",             MT_NICE_FILTER)
SetFilterMTMode("eedi3",                   MT_MULTI_INSTANCE)
SetFilterMTMode("neo_f3kdb",               MT_MULTI_INSTANCE)
SetFilterMTMode("nnedi3",                  MT_MULTI_INSTANCE)
SetFilterMTMode("warpsharp",               MT_MULTI_INSTANCE)
SetFilterMTMode("yadifmod2",               MT_NICE_FILTER)
 
#********** Initialization
PluginPath = "C:\AviSynth+\plugins64+\"
LoadPlugin(PluginPath + "MPEG2DecPlus64.dll")
LoadPlugin(PluginPath + "delogo.dll")
LoadPlugin(PluginPath + "Deblock.dll")
LoadPlugin(PluginPath + "nnedi3.dll")
LoadPlugin(PluginPath + "TIVTC.dll")
LoadPlugin(PluginPath + "KNLMeansCL.dll")
LoadPlugin(PluginPath + "neo-f3kdb.dll")
LoadPlugin(PluginPath + "warpsharp.dll")
LoadPlugin(PluginPath + "TDeint.dll")
#LoadPlugin(PluginPath + "FluxSmoothSSSE3.dll")
LoadPlugin(PluginPath + "yadifmod2.dll")
#LoadPlugin(PluginPath + "FFT3dGPU.dll")

 で、これらプラグインに更新された物が無いかチェックを行い、更新されていれば差し替えを行っていった。

Auto Load の罠

 プラグインは別に LoadPlugin で読み込まなくても Auto Load 対応の物であればスクリプト評価の後に自動で読み込まれる。
 今回、この Auto Load のせいで問題が発生していた。

 問題となっていた関数は MPEG2Source()BlindPP() の 2 つ。
 MPEG2Source() は DGIndex で demux した際に生成される d2v ファイルを指定することでソースとなる TS ファイルを読み込む。
 BlindPP() はブロックノイズを除去する為のフィルタ。

 まず MPEG2Source を使うために MPEG2DecPlus64.dll を Load していた。
 次に筆者は BlindPP も使いたかったが、昔使っていた DGDecode.dll に MPEG2Source と BlindPP が内蔵されていたからと、MPEG2DecPlus64.dll にも両者が内蔵されている物とばかり思っていた。これが大間違いだった。

 改めて現状の動作を見なおしたら次の様になっていた。

  • MPEG2DecPlus64.dll を Load して MPEG2Source を使ったつもりになっていた。
  • 実際にはスクリプト内にあった BlindPP を使うために Plugins64+ フォルダにあった DGDecode.dll ver. 1.5.8.0 が Auto Load されていた。
  • Auto Load で読み込まれた DGDecode.dll が優先されることになり、MPEG2Source の内容は古い 1.5.8.0 の物になっていた。
  • Auto Load で読み込まれた DGDecode.dll のお陰で BlindPP が使えていた。
  • つまり MPEG2DecPlus64.dll の Load は全く以て無意味だった。

 なんてちょっとややこしい事になっていたと分かった。

Auto Load に頼らない方法で解決

 原因が Auto Load にあるのなら、無効化して全てのプラグインを手動で Load すれば解決。
 その為には avs ファイル行頭に次の 1 行を追加してあげる必要がある。

ClearAutoloadDirs()

 あとは Auto Load に頼っていた部分にエラーが出るので、LoadPlugin で改めてプラグインを指定して読み込ませた。
 そして今までは MPEG2Source() の使用に MPEG2DecPlus64.dll を読み込ませていたつもりで DGDecode.dll 1.5.8.0 を使ってしまっていたが、DGDecode.dll オリジナルが約 11 年ぶりに更新され、Ver. 2.0.0.5 になっていたから入れ替えを行った。

DGMPGDec MPEG1/2 Decoder and Frame Server

 しかしまぁ、この最新版では内蔵されていた BlindPP が無効化されており、使用出来ないという事に。
 代わりに Deblock() を使用する事となった。

調整の後エンコード速度

 DGDecode.dll が 2.0.0.5 になったことでここまでエンコード速度が変わる物なのかと驚いたもんで。

 調整前にエンコードした時のエンコード速度は 39.55fps だった。
 これが調整後には 71.46fps にまで 1.8 倍の伸びを見せてくれた。
 共にソースは同一の 24:00 アニメで、相違点は MPEG2Source に使用する dll ファイルの違いとブロックノイズ除去フィルタを BlindPP から Deblock へ変更の 2 点のみ。

 BlindPP から Deblock にフィルタを変えたことが原因なのかもと思ったが、DGDecode.dll 1.5.8.0 の MPEG2Source + Deblock に変えても元通り遅くなったので DGDecode.dll 2.0.0.5 の MPEG2Source が速いという事になるのかなと。

おわりに

 今回の問題に何年気付かずにいたのかなー!!? と自分を責めたい気分になってくるのだが、自分で気付いたしまぁ良いかなと。
 それにしても MPEG2Source という動画ソースの読み込みに使う dll を入れ替えただけでここまで速くなるとは思いもよらず、結果としては良い物が得られたかなと思う。

筆者 avs ファイルをドーンとペタり

 変数 editmode で解像度や画質の選択、変数 chNo で配列 ch からロゴ消しの局名を選択するタイプのスクリプト。

SetMemoryMax(8192)
ClearAutoloadDirs()

SetFilterMTMode("DEFAULT_MT_MODE",         MT_SERIALIZED)

SetFilterMTMode("D3DVP",                   MT_MULTI_INSTANCE)
SetFilterMTMode("Deblock",                 MT_NICE_FILTER)
SetFilterMTMode("EraseLOGO",               MT_MULTI_INSTANCE)
SetFilterMTMode("FFT3dGPU",                MT_SERIALIZED)
SetFilterMTMode("FluxSmoothST",            MT_SERIALIZED)
SetFilterMTMode("KNLMeansCL",              MT_MULTI_INSTANCE)
SetFilterMTMode("MPEG2Source",             MT_NICE_FILTER)
SetFilterMTMode("MipSmooth",               MT_SERIALIZED)
SetFilterMTMode("TDecimate",               MT_SERIALIZED)
SetFilterMTMode("TDeint",                  MT_MULTI_INSTANCE)
SetFilterMTMode("TFM",                     MT_MULTI_INSTANCE)
SetFilterMTMode("UnsharpMask",             MT_MULTI_INSTANCE)
SetFilterMTMode("aWarpSharp2",             MT_NICE_FILTER)
SetFilterMTMode("eedi3",                   MT_MULTI_INSTANCE)
SetFilterMTMode("neo_f3kdb",               MT_MULTI_INSTANCE)
SetFilterMTMode("nnedi3",                  MT_MULTI_INSTANCE)
SetFilterMTMode("warpsharp",               MT_MULTI_INSTANCE)
SetFilterMTMode("yadifmod2",               MT_NICE_FILTER)
 
#********** Initialization
PluginPath = "C:\AviSynth+\plugins64+\"
#LoadPlugin(PluginPath + "MPEG2DecPlus64.dll")
LoadPlugin(PluginPath + "DGDecode_2.0.0.5.dll")
#LoadPlugin(PluginPath + "DGDecode_1.5.8.0.dll")
LoadPlugin(PluginPath + "delogo.dll")
LoadPlugin(PluginPath + "Deblock.dll")
LoadPlugin(PluginPath + "nnedi3.dll")
LoadPlugin(PluginPath + "TIVTC.dll")
LoadPlugin(PluginPath + "KNLMeansCL.dll")
LoadPlugin(PluginPath + "neo-f3kdb.dll")
LoadPlugin(PluginPath + "warpsharp.dll")
LoadPlugin(PluginPath + "TDeint.dll")
#LoadPlugin(PluginPath + "FluxSmoothSSSE3.dll")
LoadPlugin(PluginPath + "yadifmod2.dll")
#LoadPlugin(PluginPath + "FFT3dGPU.dll")
#********** Loading 
MPEG2Source("demux.d2v")
AudioDub(last, WavSource("faw.wav"))

# *****************************************************
# *** 編集が終わったら 1~3 にして保存する (De-interlace / 24fps ON/OFF) ***
# 0 = Edit Mode, 1 = 720p, 2 = 1080p, 3 = 720p Low.Quality, 5 = debug
editmode = 0

# *****************************************************

# *** 放送局によって EraseLogo のパラメータを変える ***
# chNo : 0 = TOKYO MX, 1 = TBS, 2 = TV TOKYO, 3 = FujiTV
chNo = 0
ch = ["mx", "tbs", "tx", "cx"]

#********** Edit *****************************************************
# Trimming
#Trim(491, 7383) ++ Trim(9183, 23327) ++ Trim(25127, 46494) ++ Trim(48294, 49041)

# DeLetter
#deletterl(29*2+1, 7896*2+1, "mx")
#deletterl(8301*2, 21412*2+1, "mx")
#deletterl(21517*2, 42780*2, "mx")
#deletterl(85471, 85560, "mx")
#deletterl(6114, 42408)

#********** DeLogo
if ( ch[chNo] == "mx" ) {
    # -- TOKYO MX1 --
    #EraseLOGO(logofile="S:\tsenc\Logo\20180710_TokyoMX1 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=0, fadein=0, fadeout=1, end=43965,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180710_TokyoMX1 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=0, fadein=0, fadeout=0, end=43064,interlaced=true)

}
else if ( ch[chNo] == "tbs" ) {
    # -- TBS --
    #EraseLOGO(logofile="S:\tsenc\Logo\20200404_TBS 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=0, fadein=0, fadeout=9, end=4490,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20200404_TBS 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=4503, fadein=9, fadeout=9, end=16448,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20200404_TBS 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=16461, fadein=9, fadeout=8, end=43149,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20200404_TBS 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=43165, fadein=9, fadeout=8, end=43898,interlaced=true)
}
else if ( ch[chNo] == "cx" ) {
    # -- FujiTV --
    #EraseLOGO(logofile="S:\tsenc\Logo\20141230_FujiTV 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=0, fadein=0, fadeout=0, end=-1,interlaced=true)
}
else if ( ch[chNo] == "tx" ) {
    # -- TV Tokyo --
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=0, fadein=0, fadeout=0, end=-1,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=6, fadein=0, fadeout=0, end=2966,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=3003, fadein=0, fadeout=1, end=17802,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=17837, fadein=1, fadeout=0, end=32636,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=32673, fadein=0, fadeout=0, end=43575,interlaced=true)
}

#********** Effects
if ( editmode >= 1 ) {
    #*** DeInterlace
    AssumeTFF()
    
    if ( editmode != 3 ) {
        TIVTC24P2()
    } else if ( editmode == 3 ) {
        Yadifmod2( mode=0, order=-1, field=-1, edeint=nnedi3() ).TDecimate( mode=1, hybrid=0 )
    }
    
    #*** Noise Reduction
    if ( editmode != 3 ) {
        KNLMeansCL( d = 1, a = 1, s = 4, h = 3 )                        # Tuned 2021.05.02
    }
}

#********** Resize & Deblock
if ( editmode == 1 ) {              # 720p
    Spline36Resize(960, 720)
    Deblock( quant=26, aOffset=0, bOffset=0, planes="yuv" )
} else if ( editmode == 2 ) {       # 1080p
    Spline36Resize(1440, 1080)
    Deblock( quant=26, aOffset=0, bOffset=0, planes="yuv", opt=0 )      # Tuned 2021.05.03 01:08
} else if ( editmode == 3 ) {       # 720p fast
    Spline36Resize(960, 720)
} else if ( editmode == 5 ) {       # 720p for debug
    Spline36Resize(1280, 720)
    Deblock( quant=26, aOffset=0, bOffset=0, planes="yuv", opt=0 )
} else {                            # 720p default
    BicubicResize(1280, 720)
}

#********** Effect ***************************************************
if ( editmode >= 1 ) {
    if ( editmode != 3 ) {
        UnsharpMask(18, 5, 10)
        #WarpSharp(64, 2, 80, -0.6)
        #aWarpSharp(depth=32.0, blurlevel=1, thresh=0.3, cm=0)
    
        #*** Debanding
        ConvertBits( bits = 10 )
        neo_f3kdb( output_depth = 10 )
    }
}

#********** END ******************************************************
Prefetch( threads = 8 )
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
}
著者プロフィール
ぶっち

本格的に PC へ触れ始めてたのは 1990 年位から。
興味は PC 全般。OS は Windows と Linux などを嗜む。
プログラマやネットワークエンジニアを経てフリーに活動している 40 代も後半に入ったおじさんです。

ぶっちをフォローする

コメント

  1. 大変参考になりました。
    AviSynth 2.6 MTだと20スレッドまでしか扱えなかったので、最近の多コアCPUでもHTやSMTを切って運用しておりましたが、
    AviSynth+へ乗り換えることができまして、5950XでもSMTオンに出来ました。
    ただ、AviSynth+でも32スレッドはフルに扱えず。大体実コアでの処理になるのは意外でした。

    •  コメントありがとうございます!
       AviSynth+ では潤沢なスレッドを全て活用してくれますが、それはあくまで AviSynth+ 本体のみのお話しになります。
       使用する「フィルター」によっては MT で処理出来ない性質の物や、そもそもフィルター自体が古くて MT に上手く対応しきれない物もあります。
       そう言った物が足を引っ張ってしまうので、全スレッドを 100% 使う事は滅多に無いです。
       当方環境では TDeint を使用していますので、これがもの凄い足を引っ張ります。たしかこれは SingleThread でしか動きようが無い物とどっかで見た記憶があるので。(もし使っているなら一度外してエンコして見ると分かりやすいかも知れません。)

       そんなわけで使用するフィルターによってスレッドをどれだけ使えるかどうかが変わってくる、というお話しになります。

      • 返信ありがとうございます。

        わかりやすい解説で大変参考になります。

        最初はTIVTCを2.6で使用していたのですが、エンコードが途中で止まったり遅かったりで不安定だったので、同じくTDeintを使用しております。
        +環境だと記述は合っているのですが何故か使えなくてコマンドプロンプトが落ちてしまうので諦めました。

        それでもうちの環境だと100fpsは出るので満足しております。

        SMTをオンに出来るようになったのでスリープも使えるようになりました。
        AMD環境はSMTをオフにしてると何故か電源プランからスリープが消えて困っておりました。

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.