2006
07/25

2 ちゃんねる DTV 板の Avisynth スレッドにおいて、HCENC018(HC Encoder v0.18) で iDust 関数が使えないという話が出ていたので、ちょっと試してみました。

iDust 関数とは

myFunctions: iDust関数と下記の説明を参照。

テスト結果

フィルタ適用前(ソース)

20090410223928p:image:w480
フィルタ適用前(1 フレーム目)

20090410223927p:image:w480
フィルタ適用前(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 フィルタを適用したあと、再度、フレーム結合した場合。結果は、片方のフィールドが、先頭のフレームのそれに、すべて置き換えられてしまう(下図参照)。

20090410224058p:image:w480
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 では、優先的にこちらのプラグインが使われるようにする。結果は、一見、問題がないように見える(下図参照)。

20090410224201p:image:w480
iDust 適用後(2 フレーム目)

HC Encoder でエンコードすると

上述の iDust 適用後の AVS ファイルを HC Encoder v0.18 でエンコードしてみました(interlacedをオンに、フィールドオーダーをTFFにした以外は、設定はデフォルトのまま)。

20090410224245p:image:w480
HC Encoder によるエンコード結果(2 フレーム目)

HC Encoder v0.18 で出力した MPEG-2 ファイルを、AviUtl 0.98d(MPEG-2 VIDEO VFAPI Plug-In)で開いたところ。iFilter を適用したのと同じような状態になっている。

その他のエンコーダでは?

ためしに同じ AVS ファイルを他のエンコーダでもエンコードしてみました。以下、結果のみ掲載しておきます。

20090410224424p:image:w480
VirtualDub + Huffyuv YV12(ffdshow)(2 フレーム目)

20090410224423p:image:w480
QuEnc(2 フレーム目)

20090410224421p:image:w480
CCE Basic(2 フレーム目)*1

一番上は VirtualDub で、下の 2 つは AviUtl で開いたところ。QuEnc の画質が劣るように見えますが、これは短いソースであったことや設定の不備(QuEnc や HCEnc は今回初めて使用したため、使い方がよくわかりませんでした)が関係している可能性があります。

対策

HC Encoder では iDust 関数を使わないほうがいいようです。対処法は、今のところありません。代わりに、以下のような方法が考えられます(動作を保証するという意味ではありません)。

*1:CCE Basicのみ「ConvertYV12(true)」せず。

RELATED POSTS

にーやん(niiyan)の雑記ブログです。

デザイン、プログラミング、動画など、興味のあることを書いてます。