视频基础理论 ------ 分辨率 / 帧率 / 码率 / Gamma / YUV
30 多篇 API 都讲了,回过头来补内功。这一篇把视频领域那些"老在用但没人说清"的术语彻底讲明白:分辨率、帧率、码率、隔行 vs 逐行、Gamma、YUV vs RGB、色域、采样定理。
本文速览
| 章节 | 阅读重点 |
|---|---|
| 0. 视频本质上是什么 | 把握本节核心概念和使用场景 |
| 1. 分辨率(Resolution) | 把握本节核心概念和使用场景 |
| 2. 帧率(Frame Rate / FPS) | 把握本节核心概念和使用场景 |
| 3. 码率(Bitrate) | 把握本节核心概念和使用场景 |
| 4. 像素 → 颜色 → YUV vs RGB | 把握本节核心概念和使用场景 |
| 5. Gamma ------ 一个被忽视的细节 | 把握本节核心概念和使用场景 |
| 6. 色域(Color Gamut) | 把握本节核心概念和使用场景 |
| 7. 采样定理(Nyquist) | 把握本节核心概念和使用场景 |
| 8. 隔行 vs 逐行(Interlaced vs Progressive) | 把握本节核心概念和使用场景 |
| 9. 常见术语速查 | 把握本节核心概念和使用场景 |
| 后续章节 | 余下 2 节继续按"概念 → 示例 → 坑点 → 总结"展开 |
0. 视频本质上是什么

视频从"一张张图片"变成可播放文件,核心链路可以拆成 4 个连续问题:
| 阶段 | 核心问题 | 后续对应知识点 |
|---|---|---|
| 像素编码 | 像素值怎么存、分辨率怎么算、每帧有多少数据 | 分辨率、像素格式、采样 |
| 颜色表示 | RGB / YUV 怎么表达颜色,人眼为什么更适合 YUV | YUV vs RGB、色域、Gamma |
| 帧内 / 帧间压缩 | 单帧怎么压缩,多帧之间怎么复用相似内容 | 编码器、I/P/B 帧、码率 |
| 码流封装 | 压缩后的音视频数据怎么组织成可播放文件 / 流 | MP4 / FLV / HLS / DASH |
一句话记忆 :视频工程的复杂度,基本都来自这条链路------像素怎么编码 → 颜色怎么表示 → 帧怎么压缩 → 流怎么封装。
1. 分辨率(Resolution)
1.1 含义
分辨率 = 宽 × 高,单位是像素(pixel)。常见档次:
| 名称 | 分辨率 | 像素总数 | 备注 |
|---|---|---|---|
| 480p | 854 × 480 | ~40 万 | SD |
| 720p | 1280 × 720 | ~92 万 | HD |
| 1080p | 1920 × 1080 | ~200 万 | FHD ⭐ |
| 2K | 2560 × 1440 | ~370 万 | QHD |
| 4K | 3840 × 2160 | ~830 万 | UHD |
| 8K | 7680 × 4320 | ~3300 万 | --- |
1.2 像素总数 = 计算量
| 分辨率 | 相对 1080p | 计算量 |
|---|---|---|
| 1080p | 1× | 基准 |
| 4K | 4× | 4 倍计算量 |
| 8K | 16× | 16 倍计算量 |
分辨率翻倍 → 像素 4 倍 → 计算量 4 倍。这就是为啥 4K 比 1080p 难播 4 倍。
1.3 显示分辨率 ≠ 视频分辨率
屏幕跟视频分辨率经常对不上。比如手机屏 2400×1080,视频是 1920×1080------播放器要做 1920 → 2400 的横向缩放(插值),缩放算法的好坏直接影响画质。
1.4 为啥很多视频是 16:9
| 序号 | 要点 |
|---|---|
| 1 | 人眼水平视角 > 垂直视角,横屏更舒服 |
| 2 | 电视行业历史延续到现在,16:9 成了通用标准 |
| 3 | 竖屏 9:16 是手机时代的产物(短视频驱动) |
2. 帧率(Frame Rate / FPS)
2.1 含义
帧率 = 每秒多少帧,单位 fps(frames per second)。
| 帧率 | 用途 |
|---|---|
| 24 fps | 电影 ⭐(传统胶片标准) |
| 25 fps | PAL 制式(欧洲电视) |
| 30 fps | NTSC 制式(北美电视)/ 通用 ⭐ |
| 50/60 fps | 高清电视 / 体育 |
| 60 fps | 游戏直播 / 高质量录像 |
| 120 fps | 慢镜头素材 |
| 240 fps | 极慢镜头 |
2.2 为什么 24 fps 看着不卡
人眼有"视觉暂留",一帧停留约 100ms。临界点:
| 帧率 | 体感 |
|---|---|
| ≥ 16 fps | 感觉是连续运动 |
| ≥ 24 fps | 流畅(电影感) |
| ≥ 60 fps | 极流畅(运动模糊也减少) |
24 fps 是"最低能接受的电影感"。低于这个会感觉一帧一帧的。
2.3 帧率不是越高越好
帧率提高带来两个连锁代价:
- 数据量↑ → 码率↑ → 文件大 / 带宽贵
- 解码 CPU↑ → 设备发热 / 功耗大
实战权衡:
| 场景 | 帧率 |
|---|---|
| 短视频 / 朋友圈 | 30 fps |
| 电影 | 24 fps |
| 体育直播 | 50/60 fps |
| 游戏直播 | 60 fps |
| 监控 | 15 fps(够用就好) |
| RTC 通话 | 15-30 fps |
2.4 VFR vs CFR
| 类型 | 全称 | 特点 | 典型场景 |
|---|---|---|---|
| CFR | Constant Frame Rate | 恒定帧率,每帧间隔严格相等 | 大多数普通视频 / 易处理 |
| VFR | Variable Frame Rate | 可变帧率 | 屏幕录制 / 监控 / 难同步 |
VFR 的实战坑:FFmpeg 转码时容易出 PTS 乱跳,需要 -vsync cfr 强制转 CFR。
3. 码率(Bitrate)
3.1 含义
码率 = 每秒多少 bits 数据,单位 bps(bits per second)。
text
1 Kbps = 1,000 bps
1 Mbps = 1,000,000 bps
不同码率档次的画质体感(H.264 编码):
| 码率 | 画质体感 |
|---|---|
| 500 Kbps | 480p 还行 |
| 2 Mbps | 720p 不错 |
| 4 Mbps | 1080p 好 |
| 20 Mbps | 4K 高质量 |
3.2 文件大小怎么算
text
文件大小(字节)= 码率(bps)× 时长(秒)÷ 8
例:1080p 4Mbps 的 60 分钟视频:
text
4_000_000 × 3600 ÷ 8 = 1.8 GB
码率确定 → 文件大小确定。这就是为啥短视频 App 要严格控制码率。
3.3 CBR / VBR / CRF 三种模式
| 模式 | 含义 | 优劣 |
|---|---|---|
| CBR Constant | 恒定码率 | 直播必备 / 文件大小可预测 |
| VBR Variable | 可变码率 | 复杂场景给高码率,简单场景省 / 文件大小不可预测 |
| CRF Constant Rate Factor | 恒定质量 | x264 / x265 默认 / 用户感知最稳 |
简单选型原则:
| 项 | 说明 |
|---|---|
| 直播 / 流媒体 | CBR |
| 归档 / 离线 | VBR 或 CRF |
| 不确定 | CRF 23(x264 默认) |
3.4 码率 vs 帧率 vs 分辨率的关系
三者任何一个上升,码率都跟着上升:
| 项 | 说明 |
|---|---|
| 分辨率↑ | 每帧需要更多 bits → 码率↑ |
| 帧率↑ | 帧总数变多 → 码率↑ |
| 画质要求↑ | 每像素更多 bits → 码率↑ |
经验值(H.264 编码):
| 分辨率 | 30fps | 60fps |
|---|---|---|
| 720p | 1.5-3 Mbps | 3-5 Mbps |
| 1080p | 3-6 Mbps | 6-10 Mbps |
| 4K | 15-25 Mbps | 25-40 Mbps |
4. 像素 → 颜色 → YUV vs RGB
4.1 RGB(屏幕用)
每个像素 = (R, G, B) 三个数。取值范围:8bit 是 0--255,10bit 是 0--1023。
举例:(255, 0, 0) = 纯红,(0, 255, 0) = 纯绿。
4.2 YUV(视频用 ⭐)
YUV 把"亮度"和"色彩"拆开:
| 项 | 说明 |
|---|---|
| Y | = 亮度(luminance) |
| U | = 蓝色差(Cb) |
| V | = 红色差(Cr) |
转换公式(BT.601):
text
Y = 0.299·R + 0.587·G + 0.114·B
U = -0.169·R - 0.331·G + 0.500·B + 128
V = 0.500·R - 0.419·G - 0.081·B + 128
4.3 为什么视频用 YUV 而不是 RGB
人眼对亮度(Y)敏感、对色彩(U/V)不敏感------这意味着 U/V 可以以更低分辨率存储而不被察觉。
YUV420 把 U/V 横纵都减半,同样画质,数据量比 RGB 少 50%。这就是 YUV420 是视频默认格式的根本原因。
4.4 YUV 子采样:4:4:4 / 4:2:2 / 4:2:0 / 4:1:1 / 4:0:0
子采样格式用 4:a:b 表示------在 4×2 像素块里,第 1 行采 a 个 UV 对、第 2 行采 b 个 UV 对。Y 永远全采。

| 格式 | UV 减少 | 数据量 vs RGB | 典型用途 |
|---|---|---|---|
| 4:4:4 | 不减 | 100%(=RGB) | 影视后期、专业制作 |
| 4:2:2 | 横向减半 | ~67% | 广播电视、专业摄像 |
| 4:2:0 ⭐ | 横纵都减半 | 50% | 视频默认(H.264/H.265/JPEG) |
| 4:1:1 | 横向减 1/4 | 50% | 老 DV 格式 |
| 4:0:0 | 无 UV | 33%(仅 Y) | 黑白视频 |
核心数据节省:4:2:0 让 4 个像素共用 1 对 UV,每像素 1.5 字节(Y + 0.25U + 0.25V),相比 RGB 的 3 字节/像素省一半。这就是"用人眼对色彩不敏感"换数据量。
4.4.1 Planar / Semi-Planar / Packed ------ 内存里怎么排
同样是 YUV 4:2:0,内存排布有 3 种 ------这就是为什么有 YUV420P 和 YUV420SP 之分:

Planar(带 P 后缀):Y / U / V 三平面分开
| 格式名 | 别名 | 排布 | 谁在用 |
|---|---|---|---|
| I420 | YUV420P | [Y...] [U...] [V...] |
FFmpeg 默认、x264/x265 输入 |
| YV12 | YUV420P | [Y...] [V...] [U...](U/V 顺序对调) |
部分老格式 / DirectShow |
Semi-Planar(SP 后缀):Y 单平面,U/V 交错
| 格式名 | 排布 | 谁在用 |
|---|---|---|
| NV12 | [Y...] [UVUVUV...] |
Android MediaCodec、Intel QSV、Apple VideoToolbox |
| NV21 | [Y...] [VUVUVU...](U/V 交错顺序对调) |
Android Camera 默认输出 |
Packed:Y/U/V 完全交错(4:2:2 才有)
| 格式名 | 排布 | 谁在用 |
|---|---|---|
| YUY2 / YUYV | [YUYVYUYV...] |
部分摄像头、Windows DirectShow |
4.4.2 "YUV420" 跟 "YUV420P" 区别
| 项 | 说明 |
|---|---|
| YUV420 | 是"4:2:0 子采样"的抽象描述,不指定内存排布。光说"YUV420"还不够,对方不知道你给的是 I420 / NV12 还是 NV21 |
| YUV420P | 明确指 Planar 排布(= I420 / YV12) |
| YUV420SP | 明确指 Semi-Planar 排布(= NV12 / NV21) |
实战经验:
| 项 | 说明 |
|---|---|
| 跟 FFmpeg 打交道 | 默认 I420(YUV420P) |
| 跟 Android Camera 打交道 | 默认 NV21 |
| 跟 Android MediaCodec 打交道 | 大概率是 NV12 (但有些机器返回 I420,必须先 query MediaFormat.KEY_COLOR_FORMAT) |
| 跟 iOS VideoToolbox | NV12(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange) |
写代码时一定要确认是哪种------拿错格式,颜色全错(蓝绿翻转、紫色花屏、整体偏色都是这个原因)。
5. Gamma ------ 一个被忽视的细节
5.1 问题
线性传输有 mismatch:
| 序号 | 要点 |
|---|---|
| 1 | 摄像机捕获的是线性光强 |
| 2 | 人眼感知是非线性(对暗部敏感) |
| 3 | 显示器响应也是非线性 |
如果直接传线性数据到屏幕,暗部细节会大量丢失。
5.2 Gamma 校正
通过两次幂运算"绕弯":编码时压暗部、解码时复原。Gamma 通常取 2.2。
text
store_value = pow(linear, 1/2.2) // 编码 (压暗)
display_value = pow(store_value, 2.2) // 显示 (反向)
5.3 为什么这么干
8bit 整数只有 256 级。线性存储下,暗部只能用 1--30、亮部却用了 31--255------大部分位深给了人眼不敏感的亮部,浪费。
Gamma 后,暗部用 1--128、亮部用 128--255,人眼看上去更"均匀",暗部细节肉眼可辨。
5.4 视频开发中的体现
不同视频源用不同 gamma 曲线,显示前要做 transfer function 转换:
| 标准 | 用途 |
|---|---|
| sRGB | 标准显示 gamma |
| BT.709 | HD 视频 gamma |
| BT.2020 | UHD 视频 gamma |
| PQ | HDR(完全不同的曲线) |
| HLG | HDR(折中) |
这就是 HDR 涉及的 transfer characteristics。第 1.4 篇细讲。
6. 色域(Color Gamut)
6.1 含义
色域 = 能表达的颜色范围(在 CIE 1931 色度图上的覆盖区域)。
主流色域:
| 色域 | 用途 | 覆盖度 |
|---|---|---|
| sRGB | 标准 web / 显示器 | 普通 |
| BT.709 | HD 视频 ⭐ | 与 sRGB 接近 |
| Display P3 | iPhone / Mac | 比 sRGB 大 25% |
| DCI-P3 | 数字电影 | 同上 |
| BT.2020 | UHD / HDR ⭐⭐ | 比 sRGB 大 80% |
6.2 为什么色域重要
- 窄色域 → 拍出的红色不够红(饱和度上限低)
- 宽色域 → 颜色范围更广,HDR 必备
第 1.4 篇专题讲。
7. 采样定理(Nyquist)
7.1 定理
要无失真地采样一个信号,采样率必须 ≥ 信号最高频率的 2 倍。
7.2 应用
7.2.1 音频
| 序号 | 要点 |
|---|---|
| 1 | 人耳能听 20Hz -- 20kHz |
| 2 | 采样率必须 ≥ 40kHz |
| 3 | 所以 CD 用 44.1kHz、视频音轨用 48kHz |
7.2.2 视频帧率
"运动"也是一种"频率":
- 帧率太低 → 运动失真(走路看着像跳)
- 24 fps ≈ 12Hz 上限(够用,因为有运动模糊掩盖)
7.2.3 抗混叠(Anti-aliasing)
缩放视频时,高频细节超过采样率会出现摩尔纹。解决方法 :缩放前做低通滤波(sws_scale 用的算法就是这个原理)。
8. 隔行 vs 逐行(Interlaced vs Progressive)
8.1 隔行扫描(1080i)
i 表示 interlaced。每"次"扫一半(一个 field):奇数行 → 偶数行 → 奇数行......每秒 50 fields = 25 frames。老 CRT 电视用这个,目的是减少闪烁。
8.2 逐行扫描(1080p) ⭐
p 表示 progressive。每"次"扫整帧。数字时代的主流。
8.3 隔行的问题
处理隔行视频时,必须先做 deinterlace(去交错),否则运动场景会出现"梳子状"(combing effect)伪影。
FFmpeg 处理:
bash
ffmpeg -i interlaced.ts -vf yadif=1 progressive.mp4
yadif 是常用的去交错滤镜。
9. 常见术语速查
| 术语 | 含义 |
|---|---|
| Aspect Ratio | 宽高比(16:9 / 4:3 / 9:16) |
| Pixel Aspect Ratio | 像素的宽高比(一般 1:1,DV 是 1.07) |
| Stride / Pitch | 每行字节数(含对齐 padding) |
| GOP | I 帧 + 跟它的所有 P/B 帧(参考 1.3 篇) |
| Profile | 编码器档次(Baseline / Main / High) |
| Level | 编码参数限制(4.1 / 5.0) |
| HDR | 高动态范围 |
| HLG / PQ | HDR 的 transfer function |
| DCT | 离散余弦变换(编码器内部) |
| Macroblock | 宏块(H.264 编码的基本单位 16×16) |
| CTU | Coding Tree Unit(H.265 编码单位 64×64) |
10. 计算示例:1080p 60fps 4Mbps H.264 视频
这个例子重点不是背公式,而是建立一个直觉:未压缩视频是 Gbps 级别,编码后才会降到 Mbps 级别。
10.1 基础参数
| 项目 | 数值 | 说明 |
|---|---|---|
| 分辨率 | 1920 × 1080 |
每帧约 207 万像素 |
| 帧率 | 60 fps |
每秒 60 帧 |
| 像素吞吐 | 1920 × 1080 × 60 ≈ 1.24 亿像素/秒 |
后续所有码率计算都从这里出发 |
| 目标码率 | 4 Mbps |
H.264 编码后的网络 / 文件码率 |
10.2 未压缩码率 vs H.264 目标码率
| 数据形态 | 每像素 bit 数 | 计算方式 | 结果 | 直觉 |
|---|---|---|---|---|
| RGB888 原始帧 | 24 bit/pixel |
1.24 亿 × 24 |
≈ 2.99 Gbps | 屏幕显示友好,但直接存 / 传输基本不可接受 |
| YUV420 原始帧 | 12 bit/pixel |
1.24 亿 × 12 |
≈ 1.49 Gbps | 已经比 RGB 省一半,但仍然远大于网络视频码率 |
| H.264 编码后 | 由码控决定 | 目标码率直接约束 | 4 Mbps = 0.004 Gbps | 通过帧内 / 帧间压缩,把数据量压到可传输范围 |
10.3 压缩比怎么算
| 对比口径 | 公式 | 压缩比 | 说明 |
|---|---|---|---|
| 按 YUV420 原始数据算 | 1492.99 Mbps ÷ 4 Mbps |
≈ 373 倍 | 更贴近编码器输入,因为 H.264 通常吃 YUV420 |
| 按 RGB888 原始数据算 | 2985.98 Mbps ÷ 4 Mbps |
≈ 746 倍 | 更适合向非视频同学解释"从屏幕像素到网络码率"的跨度 |
一句话总结 :H.264 的价值不是把 4Mbps 变得"更小",而是把 1.5Gbps 级别的原始 YUV 视频 压到 4Mbps 级别,并尽量让人眼看不出明显损失。
11. 总结
视频基础的"知识框架":

金句:视频领域 80% 的术语都跟"采样 + 压缩"有关。理解了 YUV 子采样为啥能省一半数据、Gamma 为啥要校正、码率/分辨率/帧率三角关系,剩下的细节都是这些原则的展开。