探秘音视频:色深、YUV格式、帧率与图像组等概念全解读

519 阅读18分钟

资料援引


色深(Color Depth)

亦称位深(Bit Depth) ,是描述图像中每个像素存储的颜色信息所使用的比特位数。色深越高,图像中的颜色表示就越丰富,视觉效果也就越细腻、真实。存储颜色的强度需要占用一定大小的数据空间,这个大小被称为颜色深度。

常见的色深示例

  • 1 位色深:每个像素只能显示 2 种颜色,通常是黑与白。常用于老式计算机显示器或者一些简单的图像输入、输出设备。

  • 8 位色深:即256色。每个像素能表示 2 的 8 次方(256)种颜色。这在早期的图形界面中尤为常见,现在主要用于一些特定需求如 GIF 动画。

  • 16 位色深:能够表示 65,536 种颜色(2 的 16 次方),通常被分为每个颜色通道(红、绿、蓝各占 5 位,剩余 1 位用于透明度)。

  • 24 位色深:即真彩色(True Color),每个像素能表示 16,777,216 种颜色(2 的 24 次方),其中红、绿、蓝三个通道各占 8 位。大多数现代显示器、相机和图像文件格式(如 JPEG)都采用这种色深。

  • 32 位色深:通常指在 24 位色深的基础上再加 8 位的透明度通道(Alpha)。它能处理的仍是 16,777,216 种颜色,但增加了每像素的透明度信息,用于复杂的图像合成和特效。

更高色深如 48位 和 64位色深 在专业图像处理和科学计算中使用,这些允许对图像进行极其细致的操作,且不会出现色阶过渡不均匀的问题。

10 bit 究竟比 8 bit 强到哪?

8 bit 视频在 log 模式下拍摄的视频画面,中是可以看到“拼缝”的,这其实是色彩断层/色带,色彩渐变不够丝滑导致的:

而 10 bit 视频就足够丝滑,不会遇到这种情况了,色深的选择通常取决于使用场景和质量要求,8 bit 虽然足够应对大多数场景,但是它依然有瓶颈,想要跨越上限就需要使用更高的色深(虽然色彩断层也可以通过噪点来强制丝滑,但终究只是权宜之计)。此外,拍摄 HDR 画面必须拍摄 10 bit 及以上色深的视频

总言之,较高的色深意味着更丰富的色彩表现和更平滑的色彩过渡,但同时也意味着更大的数据量和更高的计算要求。


灰度(Grayscale)

色彩灰度是指图像或颜色中各像素点的亮度值,其范围通常在 0 到 255 之间(在8位灰度图像中),其中0表示纯黑,255表示纯白。灰度图像可以认为是仅有亮度信息而没有颜色信息的图像。在色彩处理上,它是将彩色图像转化为单一通道的灰度图像的过程,保留的是亮度信息。


RGB

RGB 是红(Red)、绿(Green)、蓝(Blue)三种基色组成的颜色模型,假如红绿蓝每个颜色通道的强度占用 8 bit(取值范围为 0 到 255,总共有 256 个整数),那么颜色深度就是 24(8*3)bit,即红绿蓝三个通道各有 256(282^{8}) 个灰度,如果将红绿蓝三种颜色组合起来,即 8 bit 能呈现的所有颜色,为256256256=16777216256*256*256=16777216种。

由此推断,当色深变大时,可用的颜色也就更多了,比如 10 bit 的灰度 为 2102^{10} ,也就是红绿蓝三个通道色彩各有具有 1024 个灰度,因此最终色彩会是 10243=10737418241024^{3}=1073741824 种,超过了 10亿。

RGB 格式根据存储的位数可以分为 16 位 、 24 位 和 32 位格式。在 FFmpeg 的源码中,对应的术语 16bpp(bits per pixel)、24bpp 和 32bpp 均有注释说明。需要注意的是,由于内存的字节顺序差异(大端序/小端序),RGB 格式的通道顺序在内存中可能表现为 BGR 排列,但这仅代表字节存储顺序的差异,并不改变色彩空间本质。

16 位格式

16 位格式主要是 RGB555 和 RGB565 两种表达方式。RGB555 是每个通道分量占 5 位,空出一位不用。RGB565 则顾名思义,R 和 B 通道占 5 位,G 通道占 6 位,利用人眼对绿色更敏感的特性提升色彩精度。

 # RGB555
XRRR RRGG GGGB BBBB

# RGB565
RRRR RGGG GGGB BBBB

24 位与 32 位格式

最常用到的是 24 位格式和 32 位格式,RGB24 表示每个颜色通道分量占 8 位,共 24 位。RGB32 表示除了每个颜色通道分量占 8 位外,还有 8 位用于表示透明通道,又称 RGBA 或 ARGB 等。具体通道顺序取决于编码实现,FFmpeg 等框架需通过源码注释确认实际排列。

 # RGB24
RRRR RRRR GGGG GGGG BBBB BBBB

# RGB32
RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA

明度和色度

首先,一个像素具有两个信息,即明度( 亮度 色度

  1. 明度(Luminance): 明度是指像素的亮度,即颜色的明亮程度,可以理解为颜色接近白色的程度。

  2. 色度(Chrominance) :是描述颜色的属性,不包含亮度信息,而包含色调饱和度两个主要因素:

    1. 色调(Hue) :表示颜色在色环上的角度,比如:在色轮上 0度 表示红色,120度 指绿色,240度指蓝色。

    2. 饱和度 (Saturation) :表示颜色的纯度或鲜艳程度。饱和度低意味着颜色更接近灰色,也就是说包含更多黑白色成分;饱和度高意味着颜色纯净而鲜艳。

明度和色度的区别:

  1. 如果去除图像中的色度值,图像就会变成黑白的;如果去除图像中的明度值,图像将会变得全黑
  2. 人眼对色度的变化不如对明度的变化敏感。(正如只有明度没有色度的黑白电影可以看,但总不能对着全黑的电视机发呆吧?)

直观一点,看一组对比图:

原图 降低明度 降低色度

基于前文,在图像处理中,往往采用色度采样技术,即每个像素都保留完整的明度(亮度)信息,但色度信息则由多个相邻像素共享。从而在保证图像可视性的前提下减少数据量。

明度信息的保留对于图像的清晰度和细节呈现至关重要。如果多个像素共享明度值,会导致图像模糊、细节丢失;而共享色度信息,则对画面清晰度的影响较小,因此更适合在压缩时进行优化。

关于色彩强度的定义需注意区分不同模型,

  • 在YUV色彩模型中:

    • 亮度(Luma):Y。

    • 色度分量(Chroma):U/V 共同构成色度信息,其中:

      • U反映蓝色与黄色的平衡(Cb分量)
      • V体现红色与青色的平衡(Cr分量)
  • 在HSV/HSB色彩空间中:

    • 亮度(Value/Brightness):描述颜色接近白色的程度

    • 饱和度(Saturation):表征色彩纯度

    • 色相(Hue):定义色彩在光谱中的位置

因此,色度采样的核心思想就是:在保证图像主要细节的基础上,降低对色度分量的精度要求,从而有效减少图像存储和传输所需的数据量、实现高效压缩。这使得色度采样成为JPEG、MPEG等主流压缩标准的重要技术基础。

色度采样

色度采样(Chroma Sampling) 是图像处理中针对色度信息(Cb/Cr颜色分量)的采集与表示方法的总称。其核心在于权衡色度数据的完整性:

  • 全色度采样(4:4:4) :色度分量与亮度(Y)具有相同的分辨率,无压缩,完整保留颜色细节。

  • 色度子采样(Chroma Subsampling) :色度分量分辨率低于亮度分量,属于压缩采样,为色度采样子集,典型方案如 4:2:2、4:2:0 等。

色度子采样的技术本质:

  • 生理基础:利用人眼视网膜对亮度敏感度远高于色度的特性(视杆细胞占比95%),在感知无明显差异的前提下减少色度数据量。

  • 实现方式:以亮度采样块(如4像素宽度)为基准,按比例降低色度采样密度:

    • 4:2:2:横向色度分辨率减半,纵向完整(数据量降为66%);
    • 4:2:0:横向与纵向分辨率均减半(数据量降为50%);
    • 4:1:1:横向分辨率降至1/4(DV摄像机常用)。
维度色度采样色度子采样
定义广义的色度信息采集过程色度采样的压缩实现(降低分辨率)查看更多
是否包含压缩包含全采样(4:4:4)和子采样仅指压缩采样(如4:2:0、4:2:2)
技术目标描述如何表示颜色信息牺牲微量色度精度/优化存储/编码效率
典型应用无损格式(如PNG)、影视后期/医疗成像等高精度场景流媒体、有损压缩(JPEG/HEVC)、广播领域(4:2:0)

YUV 格式

YUV 4:X:X 中各个数字的含义是?

YUV 4:4:4为例:

  • 第一个 4:表示在每一行中的像素数量,即每行有 4 个像素。
  • 第二个 4:表示第一行像素的色度采样值。
  • 第三个 4:表示第二行像素的色度采样值。

YUV 4:4:4

YUV444 表示亮度和色度以相同的分辨率采样,也就是说,每个像素都有独立的 Y、U 和 V 分量。

  • 像素 3 个分量:一个 Y 分量,一个 U 分量,一个 V 分量。
  • 高质量:因为没有色度分量的压缩,所以色彩非常准确,适合需要高色彩精度的场景,如视频编辑和处理。
  • 带宽 需求:因为所有分量都是全分辨率,需要更多的带宽和存储空间。
YUV 4:4:4 (原始数据):
Y1 U1 V1 | Y2 U2 V2 | Y3 U3 V3 | Y4 U4 V4
Y5 U5 V5 | Y6 U6 V6 | Y7 U7 V7 | Y8 U8 V8

YUV 4:2:2

在 YUV 4:2:2 色度采样格式中,相较于无损的 4:4:4 格式,图像在水平方向上每两个像素共享一组色度(U 和 V)信息。也就是说,每行中第 2 列和第 4 列的像素并不保留各自独立的色度值,而是与相邻的第 1 列和第 3 列共享色度信息。这样一来,就在水平方向上丢失了 50% 的色度数据,从而有效压缩了数据量,而图像的亮度信息依然为每个像素单独保留,从而保证了清晰度和细节表现。

YUV 4:2:2 相比 YUV 4:4:4 数据量小了多少?

假设原始4:4:4采样每帧含N个 像素

  • 亮度 (Y) :完整保留 → 占N单位数据
  • 色度(U/V) :每个像素独立存储 → 各占N单位数据
  • 总数据量:N(Y) + N(U) + N(V) = 3N

4:2:2采样(水平2:1下采样)

  • Y:完整保留 → N
  • U/V:水平方向每2像素共享1个值 → 各占N/2
  • 总数据量:N + N/2(U) + N/2(V) = 2N
  • 数据减少比例:(3N - 2N)/3N = 1/3

4:2:0采样(水平+垂直2:1下采样)

  • Y:完整保留 → N
  • U/V:每2x2像素块共享1个值 → 各占N/4
  • 总数据量:N + N/4(U) + N/4(V) = 1.5N
  • 数据减少比例:(3N - 1.5N)/3N = 50%

关键结论

  • 1/3的减少量是相对于原始4:4:4总数据量(3N)而言的,而非单独色度分量
  • 色度分量在4:2:2中减少50%(U/V各剩1/2),但由于Y占原始数据量的1/3,U+V共占2/3,因此整体减少量为:(2/3)×50% = 1/3总数据量

YUV 4:2:2 (压缩后):
Y1 U1 V1 | Y2 U1 V1 | Y3 U2 V2 | Y4 U2 V2
Y5 U3 V3 | Y6 U3 V3 | Y7 U4 V4 | Y8 U4 V4
  • 水平采样:

    • 第一行中,像素 Y1 和 Y2 共用 U1、V1,像素 Y3 和 Y4共用 U2、V2;
    • 第二行中,像素 Y5 和 Y6共用 U3、V3,像素 Y7 和 Y8共用 U4、V4。
  • 亮度 独立:  每个像素的亮度信息(Y分量)都保持独立,确保图像细节和清晰度不受影响。

YUV 4:2:0

在 YUV 4:2:0 格式中,色度信息的采样方式更为精简。只有第一行的部分像素保留了色度信息,邻近的像素则共享这些色度值;而第二行的像素则直接沿用第一行相应位置的色度信息。换言之,每四个像素仅共享一组色度(U、V)信息,但每个像素仍保留独立的 亮度 (Y)值。这种方式大幅减少了色度数据的存储量,相较于 4:4:4 格式,色度信息减少了 75%

YUV 4:2:0 (压缩后):
Y1 U1 V1 | Y2 U1 V1 | Y3 U2 V2 | Y4 U2 V2
Y5 U1 V1 | Y6 U1 V1 | Y7 U2 V2 | Y8 U2 V2
  • 明度(Y)信息:每个像素独立保留。

  • 色度(U/V)信息:每 2×2 的 像素 (即 4 个像素)共享一组色度值,因此:

    • 像素 Y1Y4 和 Y5Y8 组成两个 2×2 块。
    • 第一个块(Y1、Y2、Y5、Y6)使用色度 U1/V1。
    • 第二个块(Y3、Y4、Y7、Y8)使用色度 U2/V2。
  • 效果:压缩掉了 75% 的色度信息,但视觉质量仍可接受,特别是在视频、图像压缩中非常常见。

总结

这是不是说明 4:4:4 比 4:2:2 和 4:2:0 要好?或者 4:2:2 比 4:2:0 要好?

👁️ 人眼感知与实际效果

虽然 4:4:4 保留了最完整的色度信息,但人眼对亮度变化更为敏感,对色度变化的感知较弱。因此,在大多数情况下,使用 4:2:2 或 4:2:0 的压缩格式,视觉上与 4:4:4 的差异并不明显。

例如,研究表明,在观看 4K 视频时,4:2:0 与 4:4:4 的视觉差异几乎不可察觉,而数据量却大幅减少,这也是为什么 4:2:0 被广泛应用于蓝光光盘和现代摄像机中的原因。

  • 色彩还原与细节:  YUV 4:4:4 > YUV 4:2:2 > YUV 4:2:0
  • 数据压缩 效率:  YUV 4:2:0 > YUV 4:2:2 > YUV 4:4:4

选择合适的色度采样格式需根据具体应用场景权衡色彩质量与数据量。

AVFrame

AVFrame 是 FFmpeg 库中用于存储解码后的视频帧或音频帧的数据结构。它主要用于封装和传递这些帧数据。

AVFrame.data 数组长度为何为 8

在 AVFrame 中,data 是一个指针数组,用于存储不同平面的视频或音频数据。data 数组的大小为 8 是为了兼顾常见视频平面和多声道音频场景,同时保留未来扩展空间。虽然通常视频处理可能使用其中较少的几个(比如 YUV 格式可能只需要用到 data[0]data[1]data[2],例如对于 YUV420P 格式,data[0] 存储 Y 平面,data[1] 存储 U 平面,data[2] 存储 V 平面)。

  1. 由宏定义决定

在 FFmpeg 的源码中,data 数组的长度由宏 AV_NUM_DATA_POINTERS 定义:

#define AV_NUM_DATA_POINTERS 8

2. 支持多种多平面/多通道格式

1.  **视频平面**:例如常见的 YUV420P,仅用到 `data[0]`(Y)、`data[1]`(U)、`data[2]`(V)三个指针,其余指针为 `NULL`(这是资源管理和灵活性之间的折中设计)。
2.  **带 Alpha 通道的视频**:如 YUVA 格式会用到第四个指针存储 Alpha 平面。
3.  **音频通道**:对于平面(planar)音频,每个声道使用一个指针;8 个指针足以支持最多 8 个声道(7.1 环绕声) [FFmpeg](https://ffmpeg.org/doxygen/2.7/structAVFrame.html?utm_source=chatgpt.com)。
4.  **副数据(side data)** :诸如 HDR 元数据、立体 3D 信息、球面映射等,通过 AVFrameSideData 存储,但并不占用 `data` 数组空间,仍可通过 `side_data` 数组访问 [FFmpeg](https://ffmpeg.org/doxygen/7.0/group__lavu__frame.html?utm_source=chatgpt.com)。

3. 扩展数据指针

当需要的平面或通道超过 8 个时,FFmpeg 还提供两个扩展机制:

  • extended_data:对 data 数组的补充,始终包含所有平面/通道指针。

  • extended_buf:存放额外的 AVBufferRef 引用,用于引用实际缓冲区。 这样可以在保证高效访问常见场景的同时,又能灵活应对更大通道数的需求 FFmpeg

VideoSampleGroup中samples_为什么有两个MediaSample?

因为双鱼眼,两个球。如果非双鱼眼的普通视频,那么至少有一个MediaSample,即使是重复推帧 唯一复杂的情况是多个clip时可能会间杂着出现不同数量MediaSample。

帧率(FPS)图像组(GOP)

🎞️ 帧率(FPS:Frames Per Second)

定义:帧率表示视频每秒钟播放的帧数。例如,30 FPS 表示每秒播放30帧。

作用

  • 流畅度:帧率越高,视频播放越流畅。常见的帧率有24、30、60 FPS等。
  • 数据量:帧率越高,单位时间内的数据量越大,对存储和带宽的要求也越高。

注意事项

  • 帧率的选择需根据应用场景权衡流畅度和资源消耗。

  • 在编码过程中,帧率通常是固定的,确保播放的一致性。

🖼️ 图像组(GOP:Group of Pictures)

定义:GOP 是视频编码中的一个结构,表示从一个关键帧(I帧)开始,直到下一个关键帧之间的所有帧组成的序列。

帧类型

  • I帧(Intra-coded Frame) :关键帧,独立编码,不依赖其他帧。
  • P帧(Predictive-coded Frame) :预测帧,依赖前面的I帧或P帧进行编码。
  • B帧(Bi-directionally Predictive-coded Frame) :双向预测帧,依赖前后的I帧或P帧进行编码。

作用

  • 压缩效率:通过帧间预测,减少冗余数据,提高压缩效率。

  • 解码依赖:非I帧的解码依赖于参考帧的完整性。

📊 GOP 大小对编码的影响

  • 在总帧数(视频时长(秒)× 帧率(FPS,每秒帧数))固定的条件下。
  • 压缩率:GOP 越大,I 帧数量越少。增大 GOP 大小表明每个 GOP 包含的帧数增多,故而 I 帧的数量减少。此时压缩率更高,但解码延迟可能会增加。
  • 画质和响应:GOP 越小,I 帧数量越多。减小 GOP 大小意味着更频繁地插入 I 帧,所以 I 帧的数量增加。这能使画质更为稳定,适用于需要快速响应的场景,例如直播。 

示例:

假设一个视频有 600 帧:

  • GOP 大小为 60:I 帧数量 = 600 / 60 = 10
  • GOP 大小为 30:I 帧数量 = 600 / 30 = 20

由此可见,在总帧数恒定的情况下,GOP 大小与 I 帧数量呈反比关系。

🔄 FPS 与 GOP 的关系

尽管 FPS 和 GOP 都涉及帧的概念,但二者关注的方面有所不同:

  • FPS:关注时间维度,决定视频的播放流畅度。
  • GOP:关注编码结构,影响压缩效率和解码复杂度。

示例

  • 30 FPS,GOP 大小为 60:每 2 秒插入一个 I 帧(60 帧 / 30 FPS = 2 秒)
  • 60 FPS,GOP 大小为 60:每 1 秒插入一个 I 帧(60 帧 / 60 FPS = 1 秒)

调整GOP大小不会改变帧率,但会影响视频的压缩效率和解码性能。

因此,GOP 大小与帧率共同决定了 I 帧的时间间隔。