VOD 深度剖析(一):视频基础——视频到底是什么?

VOD 流媒体系列(共 12 篇)的开篇之作。从字节层面理解视频究竟是什么——像素、分辨率、帧率、码率、I/P/B 帧、GOP、色彩空间与 HDR。

zhuermu··20 分钟
vodstreamingvideoresolutionframe-ratebitrate
VOD 深度剖析(一):视频基础——视频到底是什么?

这是 VOD 流媒体深度剖析系列的第 1 篇——一份共 12 篇的技术指南,涵盖从原始像素到全球规模分发的方方面面。


那些你或许从未想过的问题

你每天都在看视频,但你有没有想过:

  • 从点击”播放”到看到第一帧画面,中间到底发生了什么?
  • 为什么一部 2 小时的 Netflix 电影只有 2 GB,而 2 小时的 iPhone 原始素材却有 20 GB?
  • 为什么网络差的时候视频会”变糊”,而不是直接卡住不动?
  • 为什么 iPhone 只能原生播放 HLS,却播不了 DASH?
  • 为什么你没法把下载好的 Netflix 电影拷给别人的手机?
  • 短视频 App 是怎么做到你一滑就几乎瞬间开播的?

读完这个系列,上面每一个问题你都能答上来。


什么是视频点播(VOD)?

视频点播——VOD——顾名思义:用户想看什么就看什么,想什么时候看就什么时候看。视频文件早在播放之前就已经录制好并存放在服务器上了。

与之相对的是直播

VOD(点播)直播
内容来源预先录制好的文件摄像机/编码器实时产出
能否拖动进度?不能(或仅有限的 DVR 时移窗口)
举例Netflix、YouTube、Bilibili、在线课程体育转播、电商直播、游戏直播
工程难点以最低成本触达最多用户保持低延迟、实时编码

短视频(TikTok、YouTube Shorts)也属于 VOD。虽然它感觉上是实时的,但每一个片段其实都是预先上传好的录制内容。它被切成秒级的分片,再由推荐算法投喂给你——这正是信息流看起来永无尽头的原因。

本系列聚焦于 VOD,但其中的大多数技术(编解码器、封装容器、传输协议、DRM)同样适用于直播。


VOD 的旅程:从摄像机到你的屏幕

一段视频要经过六个阶段才能到达你的手机:

①Capture/Upload     ②Transcode           ③Package
┌─────────┐        ┌─────────┐         ┌─────────┐
│ Director │ ────►  │ Compress │ ──────► │ Cut into │
│ uploads  │        │ into many│         │ small    │
│ raw file │        │ qualities│         │ segments │
└─────────┘        └─────────┘         └─────────┘

     ┌───────────────────────────────────────┘


④Store in Cloud     ⑤CDN Distribution    ⑥Playback
┌─────────┐        ┌─────────┐         ┌─────────┐
│ Put into │ ────►  │ Copy to  │ ──────► │ Auto-   │
│ object   │        │ nearest  │         │ select  │
│ storage  │        │ data     │         │ quality │
│ (S3 etc) │        │ center   │         │ & play  │
└─────────┘        └─────────┘         └─────────┘

每个阶段都对应本系列的一个章节:

阶段它解决的问题对应篇章
①采集/上传如何可靠地把大文件传到服务器第 11 篇
②转码如何把 20 GB 的母版压到 200 MB,还依然清晰好看第 2 篇第 3 篇
③封装如何把视频 + 音频 + 字幕组合起来并切成分片第 4 篇第 5 篇
④存储如何低成本地存放海量视频第 11 篇第 12 篇
⑤CDN如何让全球用户都能快速访问第 7 篇
⑥播放如何自适应网速并防盗版第 6 篇第 8 篇第 9 篇

而贯穿始终的那条主线——你如何知道用户的体验好不好?——就是第 10 篇:QoE 指标


视频不过是一叠照片

这是本章最重要的一句话:

视频 = 一连串快速播放的图像 + 一条音轨。

当你看视频时,你的大脑看到的是:

Frame 1   Frame 2   Frame 3   Frame 4   Frame 5  ...
┌────┐   ┌────┐   ┌────┐   ┌────┐   ┌────┐
│    │   │    │   │    │   │    │   │    │
│ 🚗 │   │ 🚗 │   │ 🚗 │   │ 🚗 │   │ 🚗 │
│    │   │    │   │    │   │    │   │    │
└────┘   └────┘   └────┘   └────┘   └────┘
         (car shifts slightly right)

           ▼  Play 30 images per second → you see "smooth driving"

每一张图像都称为一(frame)。


像素与分辨率

把任意一张图片放得足够大,你就会看到一个个小方块——每一个方块记录一种颜色。这个方块就是像素(pixel)。

  • 一张 1920×1080 的图像有 1920 列 × 1080 行 = 2,073,600 个像素(约 200 万像素)。
  • 每个像素存储一个颜色值,占用几个字节。

分辨率就是像素的尺寸。常见的标识有:

标识分辨率总像素相对大小
240p426 × 240~10 万1x(基准)
360p640 × 360~23 万2.3x
480p (SD)854 × 480~41 万4.1x
720p (HD)1280 × 720~92 万9.2x
1080p (FHD)1920 × 1080~200 万20x
1440p (2K)2560 × 1440~370 万37x
2160p (4K UHD)3840 × 2160~830 万83x
4320p (8K)7680 × 4320~3320 万332x

注意:“4K”有两种版本——UHD 4K(消费级:3840×2160)和 DCI 4K(电影级:4096×2160)。

竖屏手机视频采用 9:16 比例(例如 720×1280),正好是横屏 16:9(1920×1080)的倒置。


像素如何存储颜色:RGB、YUV 与位深

RGB

最直观的方式:为每个像素分别存储红、绿、蓝三种颜色的强度。

  • 黑色 = R:0 G:0 B:0
  • 白色 = R:255 G:255 B:255
  • 每个通道占 8 位(1 字节,0–255),因此一个 RGB 像素 = 3 字节

算笔账:单张 1080p 的 RGB 帧 = 1920 × 1080 × 3 字节 ≈ 6.2 MB。按 30 fps 计算,就是 186 MB/秒——一部 2 小时的电影如果不压缩将高达 1.3 TB

这正是视频必须压缩的原因。

YUV(视频行业标准)

视频使用 YUV(也写作 YCbCr):

  • Y(亮度 Luma):像素有多亮(0 = 黑,255 = 白)
  • U、V(色度 Chroma):像素是什么颜色

为什么不直接用 RGB?因为:

人眼对亮度的敏感程度远高于对颜色的敏感程度。

YUV 正是利用了这一点:你可以记录更少的颜色信息,而肉眼几乎察觉不到差别。

色度二次采样(Chroma Subsampling)

方案说明相对 4:4:4 的数据量应用场景
4:4:4每个像素都有完整的 Y/U/V100%影视后期制作
4:2:2相邻两个像素共用一组 U/V67%广播、专业级
4:2:0相邻四个像素共用一组 U/V50%几乎所有消费级流媒体
   Luma Y (all kept)          Chroma U/V (one per 2×2 block)
   ┌──┬──┬──┬──┐             ┌─────┬─────┐
   │Y │Y │Y │Y │             │     │     │
   ├──┼──┼──┼──┤             │ UV  │ UV  │
   │Y │Y │Y │Y │             │     │     │
   ├──┼──┼──┼──┤             ├─────┼─────┤
   │Y │Y │Y │Y │             │     │     │
   ├──┼──┼──┼──┤             │ UV  │ UV  │
   │Y │Y │Y │Y │             │     │     │
   └──┴──┴──┴──┘             └─────┴─────┘
   16 Y values                4 UV pairs

   RGB 4:4:4 = 16 × 3 = 48 bytes
   YUV 4:2:0 = 16 + 4 + 4 = 24 bytes (half the data)

代价是:纯黑背景上的鲜红色文字可能会出现轻微的色彩溢出。但 99% 的自然场景看起来毫无差别。

位深(Bit Depth)

即每个通道用多少位来表示:

位深每通道取值范围每像素可表示的颜色应用场景
8 位0–2551670 万大多数消费级流媒体
10 位0–102310.7 亿HDR 必备;Netflix 4K、蓝光
12 位0–4095687 亿影视母版、Dolby Vision

8 位通常够用,但在平滑的渐变上(例如从深蓝逐渐过渡到浅蓝的天空),会出现明显的色带(banding)——不自然的阶梯状分界。HDR 内容需要 10 位来消除这种现象。


帧率(fps)

fps = 每秒帧数(frames per second)。

  • 24 fps:自 1920 年代以来的电影标准,带来那种”电影感”。
  • 25 / 50 fps:PAL 制式电视(欧洲、中国)。
  • 29.97 / 30 fps:NTSC 制式(北美、日本)。大多数手机录制的默认值。
  • 60 fps:游戏、体育、YouTube 高帧率视频。
  • 120 / 240 fps:慢动作、专业级拍摄。

为什么电影 24 fps 就够了?人的”视觉暂留”效应在大约 16 fps 时便会起作用——你的大脑此时已经看到连续的运动了。24 fps 是 1920 年代”足够流畅 + 最省胶片”的甜蜜点。但对于快速动作(体育、游戏),则需要 60 fps 以上来避免运动模糊。

留意一下 29.97 fps——这可不是打错了。NTSC 彩色电视故意把频率偏移了一点,以避免与黑白信号相互干扰。

帧率越高,文件越大。在相同分辨率和画质下,60 fps 的体积大约是 30 fps 的 1.7 倍。


码率:每秒消耗多少数据

码率(Bitrate)是指每秒视频所消耗的比特数。

  • kbps(千比特/秒):1 Mbps = 1000 kbps
  • Mbps(兆比特/秒):常用单位

文件大小 ≈ 码率 × 时长:

1 Mbps × 60 seconds ÷ 8 (bits to bytes) ≈ 7.5 MB

典型码率(H.264)

分辨率推荐码率1 分钟文件大小
240p0.3–0.5 Mbps~3 MB
360p0.5–0.8 Mbps~5 MB
480p0.8–1.2 Mbps~8 MB
720p1.5–3 Mbps~15 MB
1080p3–6 Mbps~30 MB
4K15–30 Mbps~150 MB

CBR / VBR / CRF

三种码率控制模式:

模式含义类比
CBR(恒定码率)每秒固定比特数每次都正好点 2 个菜
VBR(可变码率)复杂场景多给比特,简单场景少给饭量大的多点,饭量小的少点
CRF(恒定质量因子)质量保持恒定,码率随之变化不管点什么,都吃到八分饱为止

VOD 偏好 VBR 或 CRF——在相同文件大小下画质更好。直播偏好 CBR——码率可预测,网络传输更稳定。


I 帧、P 帧、B 帧:视频压缩的核心

这是本章最关键的概念。理解了它,编解码器那一章的内容便会豁然开朗。

视频为什么能被如此激进地压缩?

想象一段视频:一个人坐在沙发上看电视:

Frame 1: Person on couch, TV playing animation
Frame 2: Person on couch, TV playing animation (TV image changes slightly)
Frame 3: Person blinks, TV playing animation
Frame 4: Person on couch, TV playing animation

**相邻两帧之间 99% 的像素都是完全相同的。**把每一帧都完整存下来是巨大的浪费。

聪明的做法是:

  • 偶尔存一张”完整快照”
  • 其余时间只存”相比上一帧发生了什么变化”

三种帧类型

类型全称内容大小能否独立解码?
I 帧(关键帧)帧内编码(Intra-coded)一张完整图像(类似 JPEG)
P 帧预测帧(Predicted)“与前面某一帧的差异”不能——需要先有参考帧
B 帧双向预测帧(Bidirectional)“与前一帧和后一帧的差异”最小不能——需要前后两个参考帧
Timeline →
 I - P - P - P - B - P - P - B - I - P - P - P ...
 ▲                               ▲
 Keyframe                        Next keyframe
 (appears every N frames)

IDR 帧

IDR 帧(Instantaneous Decoder Refresh,即时解码刷新)是一种特殊的 I 帧:它之后的所有帧都被禁止引用它之前的任何内容。IDR 帧是”安全的起始点”。当你把进度拖到视频中间时,播放器会跳到最近的 IDR 帧开始解码。

GOP(图像组,Group of Pictures)

GOP 是两个 I 帧之间的那一组帧:

 ┌──── GOP 1 ────┐ ┌──── GOP 2 ────┐ ┌──── GOP 3 ...
  I  P  B  P  P  B  I  P  B  P  P  B  I  P ...

                    New IDR starts here

GOP 长度决定了分片的粒度:

  • 短 GOP(1–2 秒):分片更细,拖动和起播更快;文件略大(I 帧更多)
  • 长 GOP(4–10 秒):文件更小,但拖动更慢

短视频 App 通常采用短 GOP(1–2 秒),因为用户会在不同片段之间频繁滑动切换。长片 VOD 则可以采用更长的 GOP 来节省带宽。


色彩空间与 HDR

色彩空间

同一组 RGB 数值,在不同标准下会显示出不同的实际颜色

标准应用场景色域大小
sRGB网页、电脑基准
BT.709高清电视、1080p 流媒体≈ sRGB
BT.2020HDR、4K/8K比 BT.709 大约 72%
DCI-P3电影、Apple 生态介于 BT.709 与 BT.2020 之间

HDR:更亮的亮部、更暗的暗部、更丰富的色彩

传统 SDR 的峰值亮度约为 100 尼特(nits)。HDR 可达到 1,000–4,000 尼特的峰值亮度,再结合 10 位位深 + BT.2020 色域:

  • 夜空中的星星显得更亮
  • 阴影中的细节得以保留
  • 颜色更饱和且不会溢出(clipping)

主流 HDR 格式:

格式出品方关键特性
HDR10蓝光光盘协会免版税;每部电影使用静态元数据
HDR10+三星 / Amazon每个场景使用动态元数据
Dolby VisionDolby12 位、动态元数据;画质最高;需付版税
HLGBBC / NHK兼容 SDR 显示器;广播首选

请注意:HDR 视频在 SDR 显示器上并不会神奇地更好看。如果不做色调映射(tone mapping),它看起来会灰蒙蒙、发白。


动手实践:用 ffprobe 检查一段视频

# macOS / Linux
brew install ffmpeg  # or: apt install ffmpeg

# Inspect a video
ffprobe -v error -show_streams -select_streams v:0 myvideo.mp4

典型输出:

codec_name=h264            # Codec (H.264) — see Part 2
profile=High               # Encoding profile
width=1920
height=1080                # Resolution: 1080p
r_frame_rate=30000/1001    # Frame rate: 29.97 fps
pix_fmt=yuv420p            # Pixel format: YUV 4:2:0, 8-bit
color_space=bt709          # Color space: SDR
bit_rate=4500000           # Bitrate: 4.5 Mbps

读完本章,上面每一行你都应该能看懂。


核心要点

  1. 视频 = 一连串图像 + 音频。每一张图像就是一
  2. 每一帧由像素组成;分辨率就是像素的尺寸。
  3. 视频世界使用 YUV 4:2:0(数据量只有 RGB 的一半,肉眼无差别)。
  4. 位深:8 位是标准;HDR 需要 10 位。
  5. 帧率:24 fps(电影)/ 30 fps(电视)/ 60 fps(游戏/体育)。
  6. 码率 = 每秒数据量。VOD 首选 VBR/CRF。
  7. I/P/B 帧是视频实现 50–100 倍压缩的方式。
  8. GOP = 关键帧之间的那组帧。短视频使用短 GOP(1–2 秒)。
  9. HDR = 10 位 + 更宽色域 + 更高亮度——与 SDR 有着本质区别。

三对处处可见的概念

在深入之前,先把这三对概念钉牢:

  1. 编解码器 ≠ 封装容器——H.264 是一种压缩算法(编解码器);MP4 是一种文件格式(封装容器)。一个 .mp4 文件里可以装 H.264,也可以装 H.265,装 AV1。

  2. 协议 ≠ 封装——HLS 和 DASH 是”如何分发”的规则(协议);fMP4 和 TS 是”如何切片和封装”的格式(封装)。

  3. 加密 ≠ DRM——HLS AES-128 是轻量级加密(密钥一旦泄露就全盘皆输)。DRM 则是一整套体系:密钥分发 + 设备限制 + 输出保护。

这三对概念都会在本系列中详细展开。


下一篇:一部 4K 电影是如何塞进 5 GB 的?第 2 篇:视频编解码器——H.264、H.265 与 AV1

参考资料

  1. FFmpeg documentation — FFmpeg
  2. H.264: Advanced video coding — ITU-T