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):每秒放多少张
fps 是 frames 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):完整一帧就是完整一张图。720p、1080p 的 "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-编解码入门