前から気づいてはいたけれど、(VLCを使わないことで)無視していた。今回、本気で調べてみた。結論を言うと、VLC内部の問題なので根本的に解決することは不可能である。
参考
検証動画プレーヤー
- IINA
- QuickTime Player
- VLC
検証用動画
$ ffmpeg -f lavfi -i smptehdbars=s=1920x1080:r=60000/1001:d=15 -color_range tv -color_primaries bt709 -color_trc bt709 -colorspace bt709 bt709.mp4
症状
彩度が過度で(oversaturated)赤みを帯びて見える。
以下は、BT.709の動画を各プレーヤーでディスプレイプロファイル「カラーLCD」上に表示した結果である。Web掲載の都合上、sRGBに変換したのでカラーメーターで測っても誤差がある。
言い訳:この画像だとわかりにくいと思うが、著作権・肖像権の問題のない動画を用意するのが面倒だった。人物の映像だとすぐにわかる。
IINA
QuickTime
VLC
表示結果
原因を探るため、システム環境設定よりディスプレイのプロファイルをBT.709にしたときとsRGBにしたときの各アプリケーションでの表示結果を示す。念のため、VLCの設定はリセットしてからデインターレース、後処理、自動スケーリングすべてオフにした。
BT.709時
IINA
QuickTime
VLC
sRGB時
IINA
QuickTime
VLC
カラーメーターでの測定結果
以下の表は、上の表示内容のうちイエローとマゼンタをmacOSのDigital Color Meterで測定した結果である。最初にディスプレイのプロファイルをBT.709にしたものを、次にsRGBにしたものを示す。Application列とDisplay, ###列は(差異が生じた原因の)内部で行われている処理の推測である。
参考:Ricci Adams — Mac Color Meters and Color Space Conversion
BT.709
|
File, BT.709 |
Application |
Display, BT.709 |
Meter, native |
Meter, sRGB |
VLC |
191,191,0 191,0,192 |
Recognize as sRGB |
Through |
191,191,0 191,0,192 |
198,198,0 198,0,198 |
IINA |
191,191,0 191,0,192 |
Recognize as sRGB, convert to BT.709 |
Recognize as BT.709 |
184,184,0 184,0,185 |
191,191,0 191,0,192 |
QuickTime |
191,191,0 191,0,192 |
Recognize as BT.709, convert to sRGB |
Recognize as sRGB, convert to BT.709 |
192,191,0 192,0,193 |
198,198,0 198,0,199 |
sRGB
|
File, BT.709 |
Application |
Display, sRGB |
Meter, native |
Meter, sRGB |
VLC |
191,191,0 191,0,192 |
Recognize as sRGB |
Through |
191,191,0 191,0,192 |
191,191,0 191,0,192 |
IINA |
191,191,0 191,0,192 |
Recognize as sRGB, convert to BT.709 |
Recognize as BT.709, convert to sRGB |
192,191,0 191,0,192 |
192,191,0 191,0,192 |
QuickTime |
191,191,0 191,0,192 |
Recognize as BT.709, convert to sRGB |
Recognize as sRGB |
199,198,0 198,0,199 |
199,198,0 198,0,199 |
考察
VLCは、macOSのColorSyncをすっ飛ばして表示しているのではないか。また、以下のようにまとめられると思う。
- QuickTimeはディスプレイのプロファイルに関わらず常に色が正しい(ただし変換が多いため丸め誤差が必ず含まれる)
- VLCはsRGBの動画(稀有)をsRGBのディスプレイに表示するときのみ色が正しい
- IINAは動画のプロファイルに対応していないのか常に動画をsRGBと解釈してしまう
(こういうことだろうか)
動画のプロファイル ディスプレイのプロファイル
無視 無視 vlc
無視 対応 iina
対応 対応 quicktime
解決策
根本的な解決は不可能なので、ディスプレイのプロファイルを「カラーLCD」設定時にできるだけQuickTime Playerの発色に近い設定を探っていこうと思う。
QuickTimeのRGB値との2乗誤差を最小化する戦略をとる。本当はRGBではなくL*a*b*の方が人間の感覚に近いと思うのでそっちでやりたかったが、L*とa*、b*とでスケールが違うためRGBにした。
結果は、ビデオ > 出力モジュール > Mac OS XのDisplay primariesを「Adobe RGB (1998)」、Display gamma / transfer functionを「Pure power gamma 2.2」の設定が最も誤差が少なくなった(すべての組み合わせを試したわけではないが)。意外にDCI-P3が良くなかったのはガンマがDisplay P3とは違うからかな。
補正結果
多少、QuickTimeに近づいたと思う。赤みは取れた。
VLC(補正結果)
QuickTime(目標、再掲)
VLC(補正前、再掲)
追記
[追記 2021/10/21] あんま良くない。