Contents
2 ちゃんねる DTV 板の Avisynth スレッドにおいて、HCENC018(HC Encoder v0.18) で iDust 関数が使えないという話が出ていたので、ちょっと試してみました。
iDust 関数とは
myFunctions: iDust関数と下記の説明を参照。
テスト結果
フィルタ適用前(ソース)
フィルタ適用前(1 フレーム目)
フィルタ適用前(2 フレーム目)
ビデオクリップ(AVI, Huffyuv, YUY2)を AviSource フィルタで開き、スクリプトの最後で「ConvertToYV12(interlaced=true)」した AVS ファイルを、VirtualDub 1.6.15 で開いたところ。
iFilter(フィールド別フィルタリング)
SeparateFields()
even = SelectEven()
odd = SelectOdd()
even = even.PixieDust() # PixieDust 1回目
odd = odd.PixieDust() # PixieDust 2回目
Interleave(even, odd)
Weave()
SeparateFields で分離したフィールドそれぞれに PixieDust フィルタを適用したあと、再度、フレーム結合した場合。結果は、片方のフィールドが、先頭のフレームのそれに、すべて置き換えられてしまう(下図参照)。
iFilter 適用後(2 フレーム目)
iDust(フィールド別フィルタリング + Dust 対策)
DustV5プラグインのコピーを別のディレクトリに用意するかリネームして、別に用意した関数の中で読み込ませます。
SeparateFields()
even = SelectEven()
odd = SelectOdd()
even = even.PixieDust() # PixieDust 1回目
odd = odd._1MoreDust("PixieDust", ...) # _1MoreDustに変更
Interleave(even, odd)
Weave()
function _1MoreDust(...)
{
LoadPlugin("DustV5プラグインのコピー")
PixieDust(...) # PixieDust 2回目
}
フィールド分離して、フィルタ適用後に再結合するところは同じだが、片方のフィールドには、PixieDust を直接使うのではなく、Wrapper 関数(_1MoreDust)を使用。Wrapper 関数の中で DustV5 プラグイン(コピー)を読み込み、2 回目の PixieDust では、優先的にこちらのプラグインが使われるようにする。結果は、一見、問題がないように見える(下図参照)。
iDust 適用後(2 フレーム目)
HC Encoder でエンコードすると
上述の iDust 適用後の AVS ファイルを HC Encoder v0.18 でエンコードしてみました(interlacedをオンに、フィールドオーダーをTFFにした以外は、設定はデフォルトのまま)。
HC Encoder によるエンコード結果(2 フレーム目)
HC Encoder v0.18 で出力した MPEG-2 ファイルを、AviUtl 0.98d(MPEG-2 VIDEO VFAPI Plug-In)で開いたところ。iFilter を適用したのと同じような状態になっている。
その他のエンコーダでは?
ためしに同じ AVS ファイルを他のエンコーダでもエンコードしてみました。以下、結果のみ掲載しておきます。
VirtualDub + Huffyuv YV12(ffdshow)(2 フレーム目)
QuEnc(2 フレーム目)
CCE Basic(2 フレーム目)*1
一番上は VirtualDub で、下の 2 つは AviUtl で開いたところ。QuEnc の画質が劣るように見えますが、これは短いソースであったことや設定の不備(QuEnc や HCEnc は今回初めて使用したため、使い方がよくわかりませんでした)が関係している可能性があります。
対策
HC Encoder では iDust 関数を使わないほうがいいようです。対処法は、今のところありません。代わりに、以下のような方法が考えられます(動作を保証するという意味ではありません)。
- 中間ファイルを作成する。
- iDustB関数 を使う。
- ViewFields と
UnViewFields を使う。 - JDL_UnfoldFieldsVertical と JDL_FoldFieldsVertical を使う。
- HC Encoder 以外のエンコーダを検討する。
*1:CCE Basicのみ「ConvertYV12(true)」せず。