画像やリンクが無効になっている可能性もあるのでご了承下さい。
はじめに
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 になっていたから入れ替えを行った。
しかしまぁ、この最新版では内蔵されていた 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
}
コメント
大変参考になりました。
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をオフにしてると何故か電源プランからスリープが消えて困っておりました。