news 2026/9/1 20:29:23

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
音视频修炼之基础理论(四):色彩工程

色彩工程深挖 —— 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 等)
Gamma(Transfer Function)数字怎么对应真实亮度(sRGB / PQ / HLG)
矩阵(Color Matrix)RGB ↔ 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 / Mac+25%2.2DCI-P3 + sRGB Gamma
BT.2020UHD / HDR ⭐⭐+80%PQ / HLG4K 标准
Rec.2100HDR 综合同 BT.2020PQ + HLGHDR 标准

2.1 三原色不同会怎样

色彩空间"红"对应的波长
sRGB / BT.709614 nm
DCI-P3中间(620 nm 左右)
BT.2020630 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 Function

3.1 Gamma 是什么

参考 1.1 篇 §5。一句话总结:

存储的数字 ≠ 真实亮度,要经过一条曲线(transfer function)映射后才是真实亮度。原因是 8 bit 整数有限(256 级),用非线性映射给暗部更多分辨率,符合人眼感知。

3.2 标准 Gamma 曲线

标准曲线用途
sRGB接近 2.2(分段)Web
BT.709 / BT.18862.4HD 视频
Gamma 2.2严格幂函数老 PC 显示器
PQ(ST.2084)复杂曲线HDR10 ⭐
HLG(Hybrid Log-Gamma)折中直播 HDR

3.3 PQ vs HLG(HDR 的两条路)

维度PQ(Perceptual Quantizer)HLG(Hybrid Log-Gamma)
亮度映射绝对(固定 0–10000 nits)相对(跟显示器最大亮度相对)
SDR 兼容❌ 不兼容(在 SDR 屏上看是黑的)✅ 兼容(自动降级显示)
提出方Dolby(基于人眼感知)BBC + NHK 联合
典型标准HDR10 / Dolby VisionBBC iPlayer HDR / NHK BS4K
典型场景后期 / 流媒体直播 HDR

SDR 显示器最大约 100 nits、HDR 显示器约 1000–4000 nits,亮度范围扩大 10–40 倍。

3.4 实战:识别视频的 transfer

ffprobe-show_streamsvideo.mp4|grep-E"color_transfer|color_primaries|color_space"# 输出例:color_primaries=bt709color_trc=bt709color_space=bt709

播放器拿到这些后,要应用对应的转换链。


4. SDR vs HDR

4.1 HDR 三大格式

格式主推方元数据兼容性
HDR10开放标准静态(整片一组)⭐⭐⭐⭐⭐
HDR10+三星动态(逐场景)⭐⭐⭐
Dolby VisionDolby动态 + 12 bit⭐⭐⭐⭐

HDR10 是底线,HDR10+ 和 Dolby Vision 是增强

4.2 HDR10 的元数据

播放器拿这些信息做 tone mapping(亮度映射):

要点说明
SMPTE ST 2086(Mastering Display)显示器最大亮度(1000 / 4000 nits)、最小亮度、色域端点
CTA-861.3(Content Light Level)MaxCLL(最大内容亮度)、MaxFALL(最大平均亮度)

4.3 Dolby Vision 的优势

序号要点
112 bit色深(4096 级)vs HDR10 的 10 bit(1024 级)
2逐场景动态元数据(每个场景单独优化映射)
3比 HDR10 高一档

用户买电视看到 “Dolby Vision” 标志价格更高——就是这俩区别。


5. Tone Mapping —— HDR 到 SDR 的桥

5.1 问题

序号要点
1HDR 视频亮度范围 0–4000 nits
2SDR 显示器只能 0–100 nits
3直接砍掉 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-vfzscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=hable,zscale=t=bt709:m=bt709:r=tv,format=yuv420p 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 bit

SDR 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 / yuv444p10le

7. 完整色彩处理链

每一步都可能错,一致性是色彩工程的核心难题。下面 §9 列了 5 个最常见的踩坑。


8. Android 上的色彩处理

8.1 SurfaceView / TextureView

// 默认 BT.601 / BT.709// 配 HDR 显示需要:SurfaceControlsurface=...;SurfaceControl.Transactiontx=newSurfaceControl.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).defaultDisplayvalhdrCaps=display.hdrCapabilitiesif(hdrCaps.supportedHdrTypes.contains(HdrCapabilities.HDR_TYPE_HDR10)){// 屏幕支持 HDR10}

8.4 Limited Range vs Full Range

类型Y 范围U/V 范围默认场景
Limited(TV)Range[16, 235][16, 240]视频默认
Full(PC)Range[0, 255][0, 255]PC / 截图默认

搞错的后果:黑变灰、白被砍。⚠️ MediaFormat 必须设对:

format.setInteger(KEY_COLOR_RANGE,MediaFormat.COLOR_RANGE_LIMITED);// 视频

9. 几个常见坑

9.1 BT.601 / BT.709 矩阵搞混

视频分辨率应该用的矩阵
SD 视频(480p)BT.601
HD 视频(1080p)BT.709
UHD 视频(4K)BT.2020

矩阵错了 → 颜色偏(尤其红色)。

9.2 Limited Range 当 Full Range 解

视频是 Limited(16–235),解码器以为是 Full(0–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-E"pix_fmt|color"# 输出:pix_fmt=yuv420p10le ←10bitcolor_range=tv ← Limited Rangecolor_primaries=bt2020 ← 色域color_trc=smpte2084 ← PQ(HDR10!)color_space=bt2020nc ← 矩阵

10.2 转换色彩空间

用途命令
BT.2020 → BT.709 (HDR → SDR)ffmpeg -i hdr.mp4 -vf zscale=p=bt709:t=bt709:m=bt709,format=yuv420p sdr.mp4
Limited → Fullffmpeg -i in.mp4 -vf zscale=r=full out.mp4

10.3 检查 Android 设备 HDR 能力

adb shell dumpsys SurfaceFlinger --display-color

输出大概:

Display modes: HDR types: HDR10, HLG, Dolby Vision Wide color gamut: yes

11. 总结

色彩工程的"四件事一致性":

序号要点说明
1三原色(色域)红绿蓝具体是哪种红绿蓝
2白点什么是中性白
3Gamma(transfer 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,tonemap=hable
HDR 显示MediaFormat.KEY_COLOR_TRANSFER

金句:色彩工程是"被忽视的水下冰山"。普通工程师以为颜色就是 RGB 三个数,专业工程师知道这三个数没有色彩空间标识就什么都不是。HDR 时代色彩工程从"锦上添花"变成"必须懂"。

更多请关注微信公众号“音视频修炼之旅”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 20:29:08

睿答架构解析

从 0 到 1 拆解「睿答」:一个面向虾皮卖家的 AI 客服系统是怎么搭起来的作者按:这篇文章从工程视角复盘我们做「睿答(ReplyGen)」时做的架构选型、关键模块设计与踩过的坑。它不是产品软文,而是一份给同行的技术解剖—…

作者头像 李华
网站建设 2026/9/1 20:26:11

机器视觉选型三件套:镜头计算器+离线知识库+本地方案

在机器视觉项目里,最容易被低估的不是算法,而是选型。很多团队辛苦做完了算法验证,一到搭建硬件方案时才发现相机靶面、镜头焦距、工作距离根本没有匹配上,最后只能推翻重来。镜头焦距差几毫米、视野差几个厘米,都会直…

作者头像 李华
网站建设 2026/9/1 20:25:23

应用密码学实验踩坑实录:从AES、RSA到PKI的动手实践指南

简介:本资源是吉林大学应用密码学课程配套的四次综合性实验实现代码与文档,面向密码学初学者、信息安全专业学生及密码算法实践者,聚焦分组密码设计、公钥密码实现、混合加密系统构建与盲签名协议落地等核心能力训练。压缩包共27个文件&#…

作者头像 李华
网站建设 2026/9/1 20:23:53

CAD新手必练:多段线PL命令全面解析与实战应用

这次我们来看 CAD 新手练习中绕不开的一个基础命令:多段线 PL(Polyline 的缩写)。很多新手画图时习惯用直线 L,但画到箭头、墙体、道路线、轮廓线时,就会发现直线画出来的对象拼接麻烦、线宽不好控制、整体不好选中。多…

作者头像 李华
网站建设 2026/9/1 20:23:11

基于STM32F103的TM1628数码管驱动工程详解与排坑指南

简介:基于STM32F103系列单片机的TM1628数码管驱动完整工程源码,面向嵌入式初学者与开发者,解决低成本环境下多位数码管显示与按键扫描的快速实现需求。源码核心为TM1628.c/TM1628.h,采用标准GPIO模拟时序完成通信,不依…

作者头像 李华