HDな動画の色を維持した変換のメモ

ちょっといろいろ詰まったので個人的なメモ。 BT.709 な HD 動画をエンコしてると、どうにも色で納得いかない部分があるのでちょっと調べてみた。

  • AviSynth で DGDecode_MPEG2Source で読んでそのまま avs を x264 に渡す場合は全く問題なし。
  • AviUtl で DGIndex で d2v な MPEG2 を読み込む場合、 PC スケール (YUVRGB_Scale=1) で d2v を作成、 AviUtl では BT.709 で読み込んで BT.709 で x264 出力に渡してやれば色は維持される。
  • AviSynth → ConvertToYUY2 → AviUtl の場合、なぜか BT.709 → BT.601 とか意味不明な変換しないと色があわないなぁと思ったらこんなんなってて…

なんで ConverToYUY2 かましてるのにわざわざ RGB で認識してるんだろうとしばし考えてみる。良く見れば VFAPI 経由で読み込んでるから RGB24 に展開して読んでるのは当然なんですよね。 VFAPI は RGB でデータを扱うので自動で RGB に変換してるものの、そのときに基本値である BT.601 の係数でもって変換されてるんでしょう。

ってことで warpsharp に入っている avsinp.aui を入れて BT.709 で入出力させたところ、正しい色が保持されました。 どーりで、 huffyuv で中間ファイルつくって ConvertToYV12 して出力するときも ColorMatrix つけないと色がおかしくなるはずだわ。orz
このところずーっと AviSynth しか使ってなくて。ちょっと AviUtl に読み込ませてやりたい処理ができたから AviUtl を久々に使ったわけだけど、だーいぶ悩んでしまった。 DGIndex に AVS リーダーの機能があることなんて知らなかったなぁ。(苦笑)
あ、ついでに。入力プラグインの優先順位もちゃーんと確認した方がいいですよw

おまけ

DGIndex の VFAPI プラグインを使って HD な動画の色を維持しようと思ったら

ConvertToRGB24( matrix="Rec709", interlaced=true )

とかオプションを指定して渡すと、いい感じになります。インタレ指定はなくてもいいのかも?