🎬 第五章 视频基础
📄 一句话概括

人眼对亮度敏感、对色度不敏感,所以把颜色拆成 YUV 之后,色度可以少采——4:2:0 直接省掉一半数据。

📝 本节和前面几节的关系

5.1.1 讲了像素,这一节讲像素的颜色用什么方式存。

一、RGB:最直观的存法

RGB 把颜色拆成红、绿、蓝三个分量,各占一个字节。 它的好处是直接对应屏幕的发光方式——显示时红绿蓝三盏灯一混就行。 但它的坏处也很明显:三个分量同等重要,一点都省不了。

二、YUV:按人眼的敏感度拆

YUV 换了一种拆法:Y 是亮度,U 和 V 是色度。 关键事实是:人眼对亮度极其敏感,对色度却相当迟钝。 所以完全可以把亮度完整保留、色度采稀一点——这就是【色度采样】。 这不是偷工减料,而是利用人眼特性做的一次等价交换。

三、三种采样方式

4:4:4:色度不缩水,每像素 3 字节——和 RGB 一样大。 4:2:2:色度横向减半,每像素 2 字节——省三分之一。 4:2:0:色度横纵都减半,每像素 1.5 字节——省掉一半。 视频领域最常用的就是 4:2:0,几乎所有的在线视频都用它。

四、为什么这一节值得单独讲

因为它解释了一个常见疑问:为什么视频能比图片省这么多? 答案的一部分就在这里——压缩还没开始,色彩空间已经先省了一半。 所以在排查【颜色不对】【边缘发绿】这类问题时,第一步就是看它的色彩格式。

五、动手 Demo:RGB 换成 YUV,一帧小了多少

人眼对亮度敏感、对色度不敏感,所以可以把色度采样得稀一些。

w, h = 1920, 1080
for name, bpp in [("RGB 24bit", 3.0), ("YUV 4:4:4", 3.0),
                  ("YUV 4:2:2", 2.0), ("YUV 4:2:0", 1.5)]:
    print("%-12s %.1f 字节/像素   %.2f MB" % (name, bpp, w * h * bpp / 1024.0 / 1024))

实跑输出:

--------------------------------------------------------------------
RGB 换成 YUV,一帧小了多少
--------------------------------------------------------------------

人眼对亮度敏感、对色度不敏感,所以可以把色度采样得稀一些。

  色彩格式      每像素字节     1080p 一帧
  ----------------------------------------
  RGB 24bit     3.0            5.93 MB
  YUV 4:4:4     3.0            5.93 MB
  YUV 4:2:2     2.0            3.96 MB
  YUV 4:2:0     1.5            2.97 MB

  关键一项是 **YUV 4:2:0**:Y 全采、U 和 V 各只采四分之一——
  **每像素从 3 字节降到 1.5 字节,直接省掉一半。**
  压缩还没开始,色彩空间已经替我省了一次。

关键一项是 YUV 4:2:0:Y 全采、U 和 V 各只采四分之一—— 每像素从 3 字节降到 1.5 字节,直接省掉一半。 压缩还没开始,色彩空间已经替我省了一次。

30 秒实验

  1. 用 MediaInfo 看一眼你手上视频的【色彩空间】一项。
  2. 如果是 4:2:0,算一下它比 4:4:4 省了多少。

常见误区

  1. 以为 YUV 是【劣化版 RGB】。它在亮度上是完整的,丢的只是人眼分辨不出的色度。
  2. 把色彩空间和编码混为一谈。前者是取样方式,后者是压缩方式。
自测三问(点开对答案) 1. YUV 里的 Y、U、V 分别是什么? —— Y 是亮度,U 和 V 是色度。 2. YUV 4:2:0 每像素占几个字节? —— 1.5 字节(亮度完整,色度各采四分之一)。 3. 为什么色度可以少采? —— 因为人眼对色度的敏感度远低于对亮度。

相关笔记