いわゆるcolor primaries、color transfer characteristics、color spaceの扱いについて。解像度とフレームレートに関わるPAL、NTSC。解像度に関わるSD、HD、UHD。輝度のダイナミックレンジに関わるSDR、HDRなどの組み合わせで最適なオプションを指定する。これらのオプションはYUVの映像をRGBのモニターに正しく、指定した設定で表示するものである。それぞれの設定の効果については正確なことが言えないのでここでは触れない。

外部サイトの解説

ffmpeg Documentation : Codec Optionsの下の方にある。それぞれ入力、出力オプションになるので入力ファイルの前、入力ファイルの後ろ(出力ファイルの前)に指定する。入力オプションで使うときはファイルにメタデータが付いてないときである。

まとめ:色関係の設定のまとめ

基本コマンド

ffmpeg -i input
yuv422p10le(tv, bt2020nc/bt2020/arib-std-b67, progressive)

例えばこのように表示されれば以下のような順番になる。

pix_fmt(color_range, colorspace/color_primaries/color_trc, field_type)

colorspace/color_primaries/color_trcが一致すれば1つだけ表示する。

これらの情報はshowinfoフィルタでも表示される。
ffplay -i input -vf showinfo

フレーム、サンプル単位で情報を得るshowinfo、ashowinfo

1フレーム毎に以下のようにコンソールに表示される。以下は抜粋したもの。

color_range:tv color_space:bt709 color_primaries:bt709 color_trc:bt709

ffprobeで調べるなら以下のようになる。
ffprobe -v error -f lavfi -i movie=input.mp4,showinfo -select_streams v:0 -show_frames -show_entries frame=color_range,color_space,color_primaries,color_transfer -read_intervals %+#1

ffprobe の使い方

ウェブカメラやテストソース、画像などを読み込んだときや未設定の動画を未設定でエンコードすると色の情報はunknownで不明になる。入力時点で未設定のときには入力オプションで指定し、エンコードして最終的にデータを書き込むなら出力オプションで指定する。

一般的なNTSC SD動画に入力オプションと出力オプションをすべて指定した例。
ffmpeg -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m -color_range tv -i input -pix_fmt yuv420p -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m -color_range tv -c:a copy output

一般的なPAL SD動画に入力オプションと出力オプションをすべて指定した例。
ffmpeg -color_primaries bt470bg -color_trc smpte170m -colorspace smpte170m -color_range tv -i input -pix_fmt yuv420p -color_primaries bt470bg -color_trc smpte170m -colorspace smpte170m -color_range tv -c:a copy output

一般的なHD動画に入力オプションと出力オプションをすべて指定した例。
ffmpeg -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -i input -pix_fmt yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -c:a copy output

HDR10動画に入力オプションと出力オプションをすべて指定した例。
ffmpeg -color_primaries bt2020 -color_trc smpte2084 -colorspace bt2020nc -color_range tv -i input -pix_fmt yuv420p10le -color_primaries bt2020 -color_trc smpte2084 -colorspace bt2020nc -color_range tv -c:a copy output

出力オプションの代わりにH.264、HEVC、VP9、AV1、Proresはビットストリームフィルタで書き込むこともできる。
ビットストリームフィルタのまとめ

オプション

  • -color_primaries:プライマリー、色域、ガマット。色彩に影響する
    • bt709
    • bt470m:旧式のNTSC
    • bt470bg:Rec.601と同等でPAL、SECAM
    • smpte170m:smpte240mとメタデータの値は異なるが機能的には同じ。NTSCではRec.601に相当する
    • smpte240m:smpte170mとメタデータの値は異なるが機能的には同じ。NTSCではRec.601に相当する
    • film
    • bt2020
    • smpte428, smpte428_1
    • smpte431:DCI-P3
    • smpte432:Display P3(DCI-P3にD65ホワイトポイント)
    • jedec-p22
  • -color_trc:伝達特性、伝達関数、ガンマ。明るさに影響する
    • bt709
    • gamma22:bt470m。旧式のNTSCでガンマ2.2
    • gamma28:bt470bg。旧式のPALでガンマ2.8
    • smpte170m
    • smpte240m
    • linear
    • log, log100:100:1レンジの対数
    • log_sqrt, log316:100*Sqrt(10):1レンジの対数
    • iec61966_2_4, iec61966-2-4:xvYCC
    • bt1361, bt1361e
    • iec61966_2_1, iec61966-2-1:sRGB、sYCC
    • bt2020_10bit:bt2020_10
    • bt2020_12bit:bt2020_12
    • smpte2084:ITU BT.2100 PQ (Perceptual Quantization)
    • smpte428, smpte428_1
    • arib-std-b67:BT.2100 HLG, ARIB STD-B67
  • -colorspace:カラー マトリックス係数。RGBとYUVのカラースペース間の変換
    • rgb
    • bt709
    • fcc:US FCC 73.628
    • bt470bg:Rec.601と同等でPAL、NTSC、SECAM
    • smpte170m
    • smpte240m
    • ycocg
    • bt2020nc, bt2020_ncl:BT.2020 non-constant luminance, BT.2100 YCbCr
    • bt2020c, bt2020_cl:BT.2020 constant luminance
    • smpte2085:SMPTE ST 2085 YDzDx
  • -color_range:カラーレンジ
    • tv, mpeg:リミテッドレンジ
    • pc, jpeg:フルレンジ
  • -chroma_sample_location:デコード、エンコード時のクロマサンプルロケーション
    • left
    • center
    • topleft
    • top
    • bottomleft
    • bottom

オプション設定の目安

解像度とフレームレート、ダイナミックレンジの目安。解像度は縦のピクセル数。

  • SD:720未満
    PAL:bt470bg、bt601
    NTSC:bt470m、fcc、smpte170m、bt601
  • HD:720以上2160未満
    PAL:smpte240m、bt709
    NTSC:smpte240m、bt709
  • UHD:2160以上
    PAL:bt709、bt2020
    NTSC:bt709、bt2020
  • ダイナミックレンジ
    SDR:bt601、bt709、bt2020(シン・エヴァンゲリオンがUHD SDR
    HDR:bt2100、smpte2084

1024×576以下はBT.601 、1024×576より大きければBT.709。
[Ffmpeg-devel-irc] ffmpeg.log.20180226

フルレンジからの変換

フルレンジからリミテッドレンジに変換するときはフィルタで変換するか、-pix_fmt yuv420pなどで求めるリミテッドレンジに変換する。色の情報やレンジ情報が不明(未指定)のときは適宜指定する。
ffmpeg -i input -vf scale,format=yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv output
ffmpeg -i input -pix_fmt yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv output

フルレンジからトランスコードでフルレンジのまま変換するにはレンジを明示する。yuv420pを指定しているがフルレンジフラグがつくのでyuvj420pになる。
ffmpeg -i input -vf scale=in_range=full:out_range=full,format=yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range pc output
ffmpeg -i input -vf scale=in_range=full:out_range=full -pix_fmt yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range pc output

フルレンジフラグのついている10ビット深度以上のYUV映像。フルレンジフラグがついたままのyuv420p10leになる。
ffmpeg -i input -vf scale=in_range=full:out_range=full,format=yuv420p10le -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range pc output
ffmpeg -i input -vf scale=in_range=full:out_range=full -pix_fmt yuv420p10le -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range pc output

FFMPEG 10bit output video colour difference – VideoHelp Forum

ピクセル値はoscilloscopeフィルタで確認できる。
ffplay -f lavfi -i yuvtestsrc=s=960x720:d=10 -vf oscilloscope=s=1:tw=1:y=0.2
ffplay -f lavfi -i yuvtestsrc=s=960x720:d=10 -vf oscilloscope=s=1:tw=1:y=0.5
ffplay -f lavfi -i yuvtestsrc=s=960x720:d=10 -vf oscilloscope=s=1:tw=1:y=0.8

直線上の YUV, RGB の値を表示する oscilloscope

リンクのまとめ

One thought on “色の情報の扱いについて”

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)