01 · 视频基础:视频到底是什么?

VOD 流媒体系统 · 第一章

本章是全系列的地基。读完你会知道:视频文件里装的究竟是什么、像素/分辨率/帧率/色彩空间这些词是什么意思、为什么"关键帧"对视频压缩这么重要。

预计阅读时间:20 分钟

• • •

1 1.1 视频其实就是"一叠照片"

这是本章最重要的一句话,也是后面所有知识的出发点:

📌 一段视频 = 一堆连续播放的图片 + 一条音轨

没错,就这么简单。当你看一段视频,你大脑看到的其实是:

第1张图   第2张图   第3张图   第4张图   第5张图  ...
┌────┐   ┌────┐   ┌────┐   ┌────┐   ┌────┐
│    │   │    │   │    │   │    │   │    │
│ car │   │ car │   │ car │   │ car │   │ car │
│    │   │    │   │    │   │    │   │    │
└────┘   └────┘   └────┘   └────┘   └────┘
         (车向右挪一点点)
           ┃
           ▼  每秒播放 30 张 → 你看到"流畅的车在开"

每一张图叫做一帧(Frame)

💡 小贴士:这是电影发明至今 120 多年没变的原理。1895 年卢米埃尔兄弟的火车进站视频也是这么放的,只不过当年是每秒 16 张胶片。
• • •

2 1.2 一帧画面是什么?—— 像素(Pixel)

把一张照片放大无数倍,你会看到它由密密麻麻的小方块组成:

┌──┬──┬──┬──┬──┬──┐
│  │  │  │  │  │  │
├──┼──┼──┼──┼──┼──┤
│  │  │  │  │  │  │
├──┼──┼──┼──┼──┼──┤
│  │  │  │  │  │  │
├──┼──┼──┼──┼──┼──┤
│  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┘
每个小方块 = 1 个像素

每个小方块记录一个颜色,这个方块叫做像素(Pixel)

- 一张 1920x1080 的图片,意思是:横 1920 列 x 竖 1080 行,总共 2,073,600 个像素(约 200 万)。
- 每个像素存储一个颜色值,需要占几个字节(下一节说)。

分辨率(Resolution)

分辨率就是一张画面的像素尺寸。大家常说的"1080p、4K"就是分辨率的别名:

俗称 分辨率(横x竖) 像素总数 文件大小(相对)
240p 426 x 240 ~10 万 1x(基准)
360p 640 x 360 ~23 万 2.3x
480p(标清) 854 x 480 ~41 万 4.1x
720p(HD) 1280 x 720 ~92 万 9.2x
1080p(FHD) 1920 x 1080 ~200 万 20x
1440p(2K) 2560 x 1440 ~370 万 37x
2160p(4K UHD) 3840 x 2160 ~830 万 83x
4320p(8K) 7680 x 4320 ~3320 万 332x
⚠️ "4K" 其实有两种
- UHD 4K(消费级,3840x2160)← 你手机/电视看到的都是这个
- DCI 4K(电影院,4096x2160)← 真正的"4K"是电影工业的

竖屏 vs 横屏

手机短视频/短剧是竖屏,比例 9:16(例如 720x1280)。横屏电影是 16:9(例如 1920x1080)。两者数字互换。

   横屏 16:9              竖屏 9:16
 ┌──────────────┐         ┌─────┐
 │              │         │     │
 │   1920x1080  │         │ 720 │
 │              │         │  x  │
 └──────────────┘         │1280 │
                          │     │
                          └─────┘
• • •

3 1.3 每个像素怎么存颜色?—— RGB、YUV、位深

方案一:RGB

电脑最直观的方式是记录每个像素的 红(R)、绿(G)、蓝(B) 三个值。三原色混合能呈现任何颜色:

- 黑色 = R:0   G:0   B:0
- 白色 = R:255 G:255 B:255
- 红色 = R:255 G:0   B:0

每个颜色分量用 8 bit(1 字节,0-255) 表示,所以一个 RGB 像素需要 3 字节

🔍 算一算:一张 1080p RGB 图片多大?

1920 x 1080 x 3 字节 ≈ 6.2 MB / 张

如果每秒 30 张,一秒就要 186 MB!一部 2 小时电影就是 1.3 TB

这还没算音频。所以——视频必须压缩

方案二:YUV(视频世界的首选)

视频工业用的是另一种方式:YUV(有时写作 YCbCr)。

- Y(亮度/Luma):这个像素有多亮,0(全黑)到 255(全白)
- U、V(色度/Chroma):这个像素偏什么颜色

为什么不用 RGB?关键原因:

📌 人眼对亮度敏感,对颜色不敏感

利用这个特点,YUV 可以少记录一些颜色信息而视觉上几乎看不出差别。

YUV 子采样(Chroma Subsampling)

最常见的三种采样方式:

方式 说明 数据量 用在哪
4:4:4 每个像素都有完整的 Y/U/V 100% 电影后期、专业制作
4:2:2 两个相邻像素共用一组 U/V 67% 广电、专业录像
4:2:0 四个相邻像素共用一组 U/V 50% 几乎所有消费流媒体

用下面这张图理解 4:2:0:

   亮度 Y (全部保留)       色度 U/V (每 2x2 只存一组)
   ┌──┬──┬──┬──┐          ┌─────┬─────┐
   │Y │Y │Y │Y │          │     │     │
   ├──┼──┼──┼──┤          │ UV  │ UV  │
   │Y │Y │Y │Y │          │     │     │
   ├──┼──┼──┼──┤          ├─────┼─────┤
   │Y │Y │Y │Y │          │     │     │
   ├──┼──┼──┼──┤          │ UV  │ UV  │
   │Y │Y │Y │Y │          │     │     │
   └──┴──┴──┴──┘          └─────┴─────┘
   16 个 Y                 4 个 UV(每格 2x2 一组)

   RGB 4:4:4 = 16 x 3 = 48 字节
   YUV 4:2:0 = 16 + 4 + 4 = 24 字节 (省一半)
⚠️ 4:2:0 的代价:锐利红色文字在纯黑背景上(或反过来)可能略有色渗。但 99% 的自然场景看不出。

位深(Bit Depth)

每个分量用几个 bit 存:

位深 每分量取值范围 一个像素可表达的颜色 用在哪
8-bit 0-255 1677 万 (256³) 消费流媒体绝大多数
10-bit 0-1023 10.7 亿 (1024³) HDR 必须;Netflix 4K、蓝光
12-bit 0-4095 687 亿 电影母版、Dolby Vision
💡 8-bit 够用吗?

大多数场景够。但在"蓝天从深蓝渐变到浅蓝"这种大面积平滑过渡上,8-bit 经常出现肉眼可见的色带(banding)——一条一条的不自然边界。HDR 内容必须 10-bit 才能消除色带。
• • •

4 1.4 帧率(Frame Rate, fps):每秒放多少张

fpsframes per second 的缩写。

- 24 fps:电影院标准。120 年传统,观感"有电影味儿"。
- 25 fps / 50 fps:PAL 制式(欧洲、中国电视老标准)。
- 29.97 / 30 fps:NTSC(北美、日本电视)。手机录像默认多是 30fps。
- 60 fps:游戏、体育直播、YouTube 高帧率。丝滑顺畅。
- 120 fps / 240 fps:慢动作、专业拍摄。

💡 为什么电影只要 24 fps 就够?

人眼"视觉暂留"大约 1/16 秒。到了 16fps 大脑就认为是连续动作。24fps 是 1920 年代"够流畅 + 最省胶片"的平衡点。

但 24fps 看快速运动会有"拖影感"。体育、游戏必须 60fps 以上才清晰。

帧率的陷阱

- 29.97fps 不是笔误,是 NTSC 彩色电视为了向下兼容黑白信号特意避让的奇怪数字。
- 高帧率 = 文件更大。60fps 的文件在同清晰度下大约是 30fps 的 1.7 倍。
- 播放器帧率 ≠ 显示器刷新率,但显示器刷新率低于视频帧率时会丢帧。

• • •

5 1.5 码率(Bitrate):每秒塞多少数据

码率是"这段视频每秒要消耗多少 bit"。

单位是 bps(bits per second),常见:

- kbps(千 bit/秒):1 Mbps = 1000 kbps
- Mbps(兆 bit/秒):常见单位

一段视频的大小大约等于 码率 x 时长

1 Mbps x 60 秒 / 8 (字节转换) ≈ 7.5 MB

典型码率参考(H.264 编码)

分辨率 推荐码率 1 分钟文件大小
240p 0.3-0.5 Mbps ~3 MB
360p 0.5-0.8 Mbps ~5 MB
480p 0.8-1.2 Mbps ~8 MB
720p 1.5-3 Mbps ~15 MB
1080p 3-6 Mbps ~30 MB
4K 15-30 Mbps ~150 MB

CBR / VBR / CRF

三种"码率控制方式":

方式 含义 比喻
CBR(恒定码率) 每秒都用恰好 2 Mbps 点餐永远点 2 个菜
VBR(可变码率) 复杂场景多给,简单场景少给 大胃王多点,小胃口少点
CRF(恒定质量) 质量保持某个目标,码率自适应 不管点啥一定要吃到 8 分饱
📌 VOD 点播优先用 VBR 或 CRF:文件大小相近时画质更好;直播优先用 CBR:码率稳定便于网络传输。
• • •

6 1.6 关键帧、P 帧、B 帧:视频压缩的核心概念

这是本章最关键的概念。理解它,下一章讲编码就水到渠成。

为什么视频可以压得这么狠?

想象一段"人在沙发上看电视"的视频:

第 1 帧:人坐在沙发上,电视在放动画
第 2 帧:人坐在沙发上,电视在放动画(只是电视里画面变一点点)
第 3 帧:人眨了一下眼,电视在放动画
第 4 帧:人坐在沙发上,电视在放动画
...

99% 的像素在相邻帧之间是一模一样的! 如果每一帧都完整存,就是巨大浪费。

聪明的做法是:

- 偶尔存一张"完整的快照"
- 其余时候只存"这一帧跟上一帧有什么不同"

这就是 I 帧 / P 帧 / B 帧 的由来。

三种帧类型

帧类型 全称 内容 文件大小 能不能独立解码
I 帧(关键帧) Intra-coded 一张完整图片(相当于 JPEG)
P 帧(前向预测) Predicted "和前面某一帧的差异" 必须先解码前面的帧
B 帧(双向预测) Bidirectional "和前后帧的差异" 最小 必须先解码前后的帧

用图表示:

时间轴 →
 I - P - P - P - B - P - P - B - I - P - P - P ...
 ▲                               ▲
 关键帧                         下一个关键帧
 (每 N 帧出现一次)
💡 类比
- I 帧 = 一张完整的照片
- P 帧 = "上张照片基础上,那只狗从左跑到右了"
- B 帧 = "结合前一张和后一张,中间那只狗大概在中间位置"

IDR 帧:特殊的 I 帧

IDR 帧(Instantaneous Decoder Refresh)是一个特殊的 I 帧:

它后面的所有帧不允许参考它之前的任何帧。

IDR 帧是视频的"安全启动点"。拖动进度条跳到视频中段时,播放器会从最近的 IDR 帧开始解码。

GOP(Group of Pictures):两个 I 帧之间的一组画面

 ┌──── GOP 1 ────┐ ┌──── GOP 2 ────┐ ┌──── GOP 3 ...
  I  P  B  P  P  B  I  P  B  P  P  B  I  P ...
                    ▲
                    新的 IDR 开始

GOP 长度决定视频的"切片粒度":

- 短 GOP(1-2 秒):切片细,跳转快、启动快;但文件略大(I 帧多)
- 长 GOP(4-10 秒):文件小,但拖动定位慢

📌 短剧/短视频常用短 GOP(1-2s),因为用户要频繁滑动切剧集。长电影 VOD 可以用长 GOP 省带宽。
• • •

7 1.7 扫描方式:Progressive vs Interlaced

一个历史遗留问题,但面试可能问到。

- 逐行扫描(Progressive,写作 p):完整一帧就是完整一张图。720p1080p 的 "p"。
- 隔行扫描(Interlaced,写作 i):一帧分奇数行和偶数行两次扫描。老电视信号标配。1080i

逐行扫描(p)                 隔行扫描(i)
 ┏━━━━━━━━━━━━━━┓          第1场: 只扫奇数行    第2场: 只扫偶数行
 ┃━━━━━━━━━━━━━━┃           ━━━━━━━━━━━━━━
 ┃━━━━━━━━━━━━━━┃                               ━━━━━━━━━━━━━━
 ┃━━━━━━━━━━━━━━┃           ━━━━━━━━━━━━━━
 ┃━━━━━━━━━━━━━━┃                               ━━━━━━━━━━━━━━
 ┗━━━━━━━━━━━━━━┛
 (整张扫描)
⚠️ 从广电系统拿到 1080i 素材怎么办?

必须做 deinterlacing(去隔行),把两场合成一帧,否则在电脑上播放会有"梳状条纹"伪影。ffmpeg 的 -vf yadif 是最常用的工具。

现代网络 VOD 几乎全都用 p(逐行)。

• • •

8 1.8 色彩空间与 HDR:BT.709、BT.2020、HDR10

色彩空间(Color Space)

"同一个 R=200, G=50, B=50 的数值"在不同标准下显示出来的颜色是不一样的。这就是色彩空间的意义。

标准 用途 色域大小
sRGB 电脑、网页 基准
BT.709 HDTV、1080p 流媒体 约等于 sRGB
BT.2020 HDR、4K/8K 比 BT.709 大约 72%
DCI-P3 电影院、苹果生态 介于 BT.709 和 BT.2020 之间

HDR:更亮、更暗、更多颜色

传统 SDR(Standard Dynamic Range,标准动态范围)亮度上限大约 100 尼特。

HDR(High Dynamic Range) 可以做到 1000-4000 尼特峰值亮度,且配合 10-bit 色深 + BT.2020 色域,让画面:

- 夜空中的星星更亮
- 阴影里的细节保留更多
- 颜色饱和不失真

主流 HDR 格式:

格式 由谁 特点
HDR10 蓝光协会 免版税、静态元数据(每部电影一组参数)
HDR10+ 三星/亚马逊 HDR10 升级,动态元数据(每场景一组参数)
Dolby Vision Dolby 12-bit、动态元数据,质量最强;要交版权费
HLG(Hybrid Log-Gamma) BBC/NHK 同时兼容 SDR/HDR 显示器;直播首选
⚠️ 注意:HDR 视频发到 SDR 显示器上不会"自动变好看"。如果没做 tone mapping(色调映射),HDR 视频在 SDR 屏幕上会发灰
• • •

9 1.9 实战:用 ffprobe 查看一个视频文件的参数

🔍 动手试一试:安装 ffmpeg 后可以运行 ffprobe 看任何视频的详细参数。
# macOS / Linux
brew install ffmpeg  # 或 apt install ffmpeg

# 查看视频
ffprobe -v error -show_streams -select_streams v:0 myvideo.mp4

典型输出(解读):

codec_name=h264            # 编码格式(H.264) - 详见第 2 章
profile=High               # 编码档次
width=1920
height=1080                # ← 分辨率 1080p
r_frame_rate=30000/1001    # ← 帧率 29.97fps
pix_fmt=yuv420p            # ← 像素格式(YUV 4:2:0,8-bit)
color_space=bt709          # ← 色彩空间(SDR)
bit_rate=4500000           # ← 码率 4.5 Mbps

对照本章学的,你现在应该能看懂每一行。

• • •
✦ 本章要点回顾

1. 视频 = 一连串图片 + 音频;每张图片叫
2. 每张图片由像素组成;分辨率就是像素的尺寸。
3. 视频世界用 YUV 4:2:0 存像素(省一半空间,人眼察觉不到)。
4. 位深 8-bit 够用,但 HDR 需要 10-bit。
5. 帧率 24fps(电影)/ 30fps(电视)/ 60fps(游戏体育)。
6. 码率 就是每秒数据量;VBR/CRF 是 VOD 常用方式。
7. I 帧 / P 帧 / B 帧 是视频能压缩到原来几十分之一的核心技巧。
8. GOP 是两个关键帧之间的画面组;短剧用短 GOP(1-2s)。
9. HDR 是 10-bit + 更大色域 + 高亮度,跟 SDR 完全两码事。
• • •

准备好进入"视频为什么能压缩到原来的几十分之一?" → 02-编解码入门

← 返回目录   |   下一章 →