音视频修炼之基础理论(四):色彩工程

发布时间:2026/9/1 20:29:38
音视频修炼之基础理论(四):色彩工程 色彩工程深挖 —— BT.709 / BT.2020 / HDR10 / Dolby Vision同一段视频在不同手机上颜色不一样、Netflix 4K HDR 看着特别亮、抖音红色特别红——这些都跟色彩工程有关。这一篇把色彩空间、色域、HDR、Tone Mapping 的核心概念讲明白。本文速览章节阅读重点0. 一个简单问题定位常见故障和规避方式1. 色彩空间是什么把握本节核心概念和使用场景2. 主流色彩空间对比按场景做技术取舍3. Gamma 与 Transfer Function把握本节核心概念和使用场景4. SDR vs HDR把握本节核心概念和使用场景5. Tone Mapping —— HDR 到 SDR 的桥把握本节核心概念和使用场景6. 10 bit vs 8 bit把握本节核心概念和使用场景7. 完整色彩处理链把握本节核心概念和使用场景8. Android 上的色彩处理把握本节核心概念和使用场景9. 几个常见坑定位常见故障和规避方式后续章节余下 2 节继续按“概念 → 示例 → 坑点 → 总结”展开0. 一个简单问题色彩工程要解决的就是让拍出来的颜色在所有设备上看起来一样——听起来简单做起来要管 4 件事的一致性下一节展开。1. 色彩空间是什么色彩空间 一组规则用(R, G, B)或(Y, U, V)三个数描述真实颜色。但光有三个数不够——必须告诉对方你用的是哪一组规则否则数字就是空话。序号元素含义①三原色Primaries红绿蓝具体对应哪种波长哪种红 / 绿 / 蓝②白点White Point什么算中性白D65 / D60 等③GammaTransfer Function数字怎么对应真实亮度sRGB / PQ / HLG④矩阵Color MatrixRGB ↔ YUV 怎么互转BT.601 / BT.709 / BT.2020这 4 件事任何一件不同颜色就变了。2. 主流色彩空间对比色彩空间用途色域Gamma特点sRGBWeb / 普通显示器 ⭐标准2.21996 标准Web 默认BT.709HD 视频1080p⭐同 sRGBBT.1886HDTV 标准DCI-P3数字电影25%2.6影院Display P3iPhone / Mac25%2.2DCI-P3 sRGB GammaBT.2020UHD / HDR ⭐⭐80%PQ / HLG4K 标准Rec.2100HDR 综合同 BT.2020PQ HLGHDR 标准2.1 三原色不同会怎样色彩空间红对应的波长sRGB / BT.709约614 nmDCI-P3中间620 nm 左右BT.2020约630 nm更红接近纯红激光同样数字(255, 0, 0)在不同色彩空间下表示的红是不同程度的红——前者带橙调后者饱和度更高。2.2 用矩阵转换播放器拿到 BT.709 视频但屏幕是 BT.2020 → 必须做色彩转换否则颜色偏冷。BT.709 → BT.2020 的转换矩阵R_2020 0.6274·R_709 0.3293·G_709 0.0433·B_709 G_2020 0.0691·R_709 0.9195·G_709 0.0114·B_709 B_2020 0.0164·R_709 0.0880·G_709 0.8956·B_709每个像素都要做一次 3×3 矩阵乘法——所以这种转换通常放 GPU 做。3. Gamma 与 Transfer Function3.1 Gamma 是什么参考 1.1 篇 §5。一句话总结存储的数字 ≠ 真实亮度要经过一条曲线transfer function映射后才是真实亮度。原因是 8 bit 整数有限256 级用非线性映射给暗部更多分辨率符合人眼感知。3.2 标准 Gamma 曲线标准曲线用途sRGB接近 2.2分段WebBT.709 / BT.18862.4HD 视频Gamma 2.2严格幂函数老 PC 显示器PQST.2084复杂曲线HDR10 ⭐HLGHybrid Log-Gamma折中直播 HDR3.3 PQ vs HLGHDR 的两条路维度PQPerceptual QuantizerHLGHybrid Log-Gamma亮度映射绝对固定 0–10000 nits相对跟显示器最大亮度相对SDR 兼容❌ 不兼容在 SDR 屏上看是黑的✅ 兼容自动降级显示提出方Dolby基于人眼感知BBC NHK 联合典型标准HDR10 / Dolby VisionBBC iPlayer HDR / NHK BS4K典型场景后期 / 流媒体直播 HDRSDR 显示器最大约 100 nits、HDR 显示器约 1000–4000 nits亮度范围扩大 10–40 倍。3.4 实战识别视频的 transferffprobe-show_streamsvideo.mp4|grep-Ecolor_transfer|color_primaries|color_space# 输出例:color_primariesbt709color_trcbt709color_spacebt709播放器拿到这些后要应用对应的转换链。4. SDR vs HDR4.1 HDR 三大格式格式主推方元数据兼容性HDR10开放标准静态整片一组⭐⭐⭐⭐⭐HDR10三星动态逐场景⭐⭐⭐Dolby VisionDolby动态 12 bit⭐⭐⭐⭐HDR10 是底线HDR10 和 Dolby Vision 是增强。4.2 HDR10 的元数据播放器拿这些信息做 tone mapping亮度映射要点说明SMPTE ST 2086Mastering Display显示器最大亮度1000 / 4000 nits、最小亮度、色域端点CTA-861.3Content Light LevelMaxCLL最大内容亮度、MaxFALL最大平均亮度4.3 Dolby Vision 的优势序号要点112 bit色深4096 级vs HDR10 的 10 bit1024 级2逐场景动态元数据每个场景单独优化映射3比 HDR10 高一档用户买电视看到 “Dolby Vision” 标志价格更高——就是这俩区别。5. Tone Mapping —— HDR 到 SDR 的桥5.1 问题序号要点1HDR 视频亮度范围 0–4000 nits2SDR 显示器只能 0–100 nits3直接砍掉 100 以上→ 高光全白过曝4线性压缩→ 整体偏暗需要智能映射也就是tone mapping——保持中间调正常只压缩高光区域。5.2 常见 Tone Mapping 算法算法特点Reinhard简单 / 通用Hable电影感 / 影视常用 ⭐ACES电影业标准BT.2390广播电视推荐Mobius移动端低开销5.3 FFmpeg Tone Mapping# HDR10 → SDR (FFmpeg zscale)ffmpeg-ihdr.mp4-vfzscaletlinear:npl100,formatgbrpf32le,zscalepbt709,tonemaphable,zscaletbt709:mbt709:rtv,formatyuv420p sdr.mp4参考第 5.3 篇命令行滤镜。5.4 GPU Tone Mapping// 简化版 Reinhard vec3 reinhard(vec3 color) { return color / (color vec3(1.0)); } // 简化版 Hable (电影感) vec3 hable(vec3 color) { float A 0.15, B 0.50, C 0.10, D 0.20, E 0.02, F 0.30; return ((color * (A*color C*B) D*E) / (color * (A*color B) D*F)) - E/F; }短视频 / 直播 App 常在 fragment shader 里做 tone mapping避免 CPU 跑完整 zscale 链路。6. 10 bit vs 8 bit位深级数用途8 bit256 级SDR ⭐10 bit1024 级HDR 必备 ⭐12 bit4096 级Dolby Vision为什么 HDR 必须 10 bitSDR 100 nits 范围, 8 bit 256 级 → 每级 0.4 nits HDR 4000 nits 范围, 8 bit 256 级 → 每级 16 nits → 暗部出现 banding (色带) HDR 4000 nits 范围, 10 bit 1024 级 → 每级 4 nits → 大致避免 banding实战识别ffprobe-show_streamsvideo.mp4|greppix_fmt# 8 bit: yuv420p / yuv422p / yuv444p# 10 bit: yuv420p10le / yuv422p10le / yuv444p10le7. 完整色彩处理链每一步都可能错一致性是色彩工程的核心难题。下面 §9 列了 5 个最常见的踩坑。8. Android 上的色彩处理8.1 SurfaceView / TextureView// 默认 BT.601 / BT.709// 配 HDR 显示需要:SurfaceControlsurface...;SurfaceControl.TransactiontxnewSurfaceControl.Transaction();tx.setColorTransform(surface,1f,0f,0f,...);// 色彩矩阵tx.apply();8.2 MediaCodec HDR 输出MediaFormatformat...;format.setInteger(KEY_COLOR_STANDARD,MediaFormat.COLOR_STANDARD_BT2020);format.setInteger(KEY_COLOR_RANGE,MediaFormat.COLOR_RANGE_LIMITED);format.setInteger(KEY_COLOR_TRANSFER,MediaFormat.COLOR_TRANSFER_ST2084);COLOR_TRANSFER_ST2084 PQ。HLG 用COLOR_TRANSFER_HLG。8.3 屏幕能力查询valdisplay(context.getSystemService(WINDOW_SERVICE)asWindowManager).defaultDisplayvalhdrCapsdisplay.hdrCapabilitiesif(hdrCaps.supportedHdrTypes.contains(HdrCapabilities.HDR_TYPE_HDR10)){// 屏幕支持 HDR10}8.4 Limited Range vs Full Range类型Y 范围U/V 范围默认场景LimitedTVRange[16, 235][16, 240]视频默认⭐FullPCRange[0, 255][0, 255]PC / 截图默认搞错的后果黑变灰、白被砍。⚠️ MediaFormat 必须设对format.setInteger(KEY_COLOR_RANGE,MediaFormat.COLOR_RANGE_LIMITED);// 视频9. 几个常见坑9.1 BT.601 / BT.709 矩阵搞混视频分辨率应该用的矩阵SD 视频480pBT.601HD 视频1080pBT.709UHD 视频4KBT.2020矩阵错了 → 颜色偏尤其红色。9.2 Limited Range 当 Full Range 解视频是 Limited16–235解码器以为是 Full0–255→黑色变成暗灰白色变成灰白。最常见的现象截图比视频颜色明显偏淡。9.3 HDR 视频显示在 SDR 屏 → 暗直接显示 PQ 编码视频在 SDR 屏高光全白、暗部全黑。正确做法tone mapping参考 §5。9.4 sRGB Gamma 跟 2.2 不完全等价sRGB 在低值用线性段避免 0 处的奇点2.2 在 0 处是 0——两者差几个百分点。实战通常忽略差异肉眼难辨但要做色彩管理时不能混用。9.5 截图色彩偏截图通常是 Full Range RGBA原视频是 Limited Range YUV——转换不对 → 截图比视频显示偏亮 / 偏白。✅ 截图前做正确的 YUV→RGB Limited→Full 转换。10. 实战速查10.1 识别视频的色彩参数ffprobe-show_streamsvideo.mp4|grep-Epix_fmt|color# 输出:pix_fmtyuv420p10le ←10bitcolor_rangetv ← Limited Rangecolor_primariesbt2020 ← 色域color_trcsmpte2084 ← PQ(HDR10!)color_spacebt2020nc ← 矩阵10.2 转换色彩空间用途命令BT.2020 → BT.709 (HDR → SDR)ffmpeg -i hdr.mp4 -vf zscalepbt709:tbt709:mbt709,formatyuv420p sdr.mp4Limited → Fullffmpeg -i in.mp4 -vf zscalerfull out.mp410.3 检查 Android 设备 HDR 能力adb shell dumpsys SurfaceFlinger --display-color输出大概Display modes: HDR types: HDR10, HLG, Dolby Vision Wide color gamut: yes11. 总结色彩工程的四件事一致性序号要点说明1三原色色域红绿蓝具体是哪种红绿蓝2白点什么是中性白3Gammatransfer function数字怎么对应真实亮度4矩阵RGB ↔ YUV 怎么互转任何一项不一致 → 颜色不对。主流标准对照等级色域Gamma位深典型SDRBT.7092.48 bit普通视频 ⭐HDR10BT.2020PQ10 bit流媒体 ⭐Dolby VisionBT.2020PQ12 bit高端电视HLG HDRBT.2020HLG10 bit直播 HDR工程实战要会的 4 个动作动作工具检查色彩参数ffprobe -show_streams转换色彩空间ffmpeg -vf zscale...Tone mappingffmpeg -vf zscale,tonemaphableHDR 显示MediaFormat.KEY_COLOR_TRANSFER金句色彩工程是被忽视的水下冰山。普通工程师以为颜色就是 RGB 三个数专业工程师知道这三个数没有色彩空间标识就什么都不是。HDR 时代色彩工程从锦上添花变成必须懂。更多请关注微信公众号“音视频修炼之旅”