今まで特に深く考えたこともなかったが
YUV→RGB変換時のTV、PCスケーリングの違いについて
TVのカラーにおけるデータフォーマットはYUVなのは周知のとおりなんだが
本来YUVそれぞれ8bitで表されるので0~255のどれかの値になるはず
しかしTVの場合はこの値が狭められて
Y:16~235 UV:16~240 の値で表されている
このYUVのデータは所謂リミテッドレンジとよばれデータ範囲が狭められている
反対にPCの場合はフルレンジと呼ばれ本来の0~255の範囲で取り扱う
TV側がなぜこうなったかは白黒テレビとの互換性のためらしいがよくわからん
とにかくTV録画データをPCモニターで見る場合(逆も又然り)はこの値の範囲の違いに
留意する必要があるという話
んでDivX5などが主流のときはデコーダもフルレンジのみ対応のものが多くて
このYUVをRGBに変換する際にリミテッドからフルレンジに変換する必要があった
これを属にYC伸張及びスケーリングなどと読んでいる
しかしこの変換を行う必要があるのはTVのYUVソースをRGBに変換して編集する場合で
変換せずそのままYUVソースで読み込ませる分には特に意識する必要はない
むしろ変換せずそのまま読み込んだほうが劣化せずエンコ結果が良い
これはYC伸張にも当てはまる
よってソースに忠実にエンコードしたい場合はYUV→RGB変換も
YC伸張もしないようにしてエンコードする必要がある
ただしPCでの再生はYC伸張の設定が必要(ffdshowだとデフォルトで伸張)
例えばDGIndexでd2v出力する場合
YUV→RGBの設定をTV scaleにしてd2v出力後
・AvisynthでYV12→x264エンコードする場合
カラー信号に手を加えずにエンコードできるのでベスト
x264のデフォルトで –input-range auto で –input-range tv と認識され
出力も–range auto で –range tv としてリミテッドレンジでエンコードされる
・aviutlでYV12→x264でエンコード
この場合DGIndexの入力プラグインがRGBに変換してしまうので注意
Avisynth経由で入力することでYUY2に変換されて入力される
あとはAvisynthでYV12→x264エンコードする場合と同じ
x264のデフォルト設定がTVレンジを前提にしているのでAvisynthとaviutlともに
YC伸張しないほうがトラブルも少ないし劣化も抑えられる
・敢えてフルレンジでx264エンコードしたい場合は
DGIndexのYUV→RGB設定をPC scaleにする
YV12→RGB変換した上でx264 –input-range pc 、 –range pc などどして
フルレンジでエンコードするとよい
ただしフルレンジの場合はPCで再生しないとうまくいかない場合が多い
TV側がそもそもフルレンジに対応していない場合があり
ちょっとでもTVでの再生を考えるなら
やはりデータ範囲はリミテッドにしておいたほうが良い
x264のデフォルト設定がTVレンジを想定しているので
トラブル防止のためにもリミテッドレンジのままが良いと思う
*DGIndexのYUV→RGBの設定はTV、PCどちらの設定にしても
d2vをYUV(YV12やYUY2)のまま取り扱う場合にはこの設定は無視される
*ちなみにaviutlでYUY2で編集する場合は自動的にプレビュー画面が
YC伸張された状態で表示されることに注意→出力時は伸張されない
RGBとして入力した場合はYUV→RGB設定をPC scaleにしないと色がおかしくなる
よってYC伸長はエンコード時はTVレンジにして
再生時にデコーダ側にYC伸張せようという結論でしたとさ






コメントを残す