本文讲解了视频图像的格式 RGB、YUV 和 H.264,音视频封装格式 FLV 这些理论知识。

Camera Sea

RGB 和 YUV

视频图像的非压缩数据格式有 RGB 和 YUV,RGB 大家接触的比较多,比较好理解。

对于 YUV 其中 Y 表示明亮度(Luminance 或 Luma),也称灰阶值;而 U 和 V 表示的则是色度(Chrominance 或 Chroma),它们的作用是描述影像的色彩及饱和度,用于指定像素的颜色,亮度是透过 RGB 输入信号来建立的,方法是将 RGB 信号的特定部分叠加到一起,色度则定义了颜色的两个方面:色调与饱和度,分别用 Cr 和 Cb 来表示,其中,Cr 反映了 RGB 输入信号红色部分与 RGB 信号亮度值之间的差异,而 Cb 反映的则是 RGB 输入信号蓝色部分与 RGB 信号亮度值之间的差异。

查看 视音频数据处理入门:RGB、YUV像素数据处理 了解更多。

H.264

NAL Unit

H264 Sequence

H.264 是很常见的压缩数据的视频编码,H.264 由多个 NAL Unit 组成的码流,每个 NAL Unit 之间通过 startcode 分隔,是 0x000001(3 Bytes)或 0x00000001(4 Bytes),SPS 和 PPS 是两种 NAL Unit,包括编码所用的 profile、level、图像的宽和高、deblock 滤波器等,通常位于整个码流的起始位置,在码流中间也可能出现这两种结构。

IPB 帧

视频压缩中,每帧都代表着一幅静止的图像,而在进行实际压缩时,会采取各种算法以减少数据的容量,其中 IPB 帧就是最常见的一种。

  • I 帧:帧内编码帧(intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,作为随机访问的参考点,可以当成静态图像,I 帧可以看作一个图像经过压缩后的产物,I 帧压缩可以得到 6:1 的压缩比而不会产生任何可觉察的模糊现象,I 帧压缩可去掉视频的空间冗余信息,下面即将介绍的 P 帧和 B 帧是为了去掉时间冗余信息。
  • P 帧:前向预测编码帧(predictive-frame),通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像,也称为预测帧。
  • B 帧:双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像,也称为双向预测帧。

基于上面的定义,我们可以从解码的角度来理解 IPB 帧:

  • I 帧自身可以通过视频解压算法解压成一张单独的完整视频画面,所以 I 帧去掉的是视频帧在空间维度上的冗余信息。
  • P 帧需要参考其前面的一个 I 帧或者 P 帧来解码成一张完整的视频画面。
  • B 帧则需要参考其前一个 I 帧或者 P 帧及其后面的一个 P 帧来生成一张完整的视频画面,所以 P 帧与 B 帧去掉的是视频帧在时间维度上的冗余信息。

IDR 帧与 I 帧

在 H264 的概念中有一个帧称为 IDR 帧,那么 IDR 帧与 I 帧的区别是什么呢?首先来看一下 IDR 的英文全称instantaneous decoding refresh picture,因为 H264 采用了多帧预测,所以 I 帧之后的 P 帧有可能会参考 I 帧之前的帧,这就使得在随机访问的时候不能以找到 I 帧作为参考条件,因为即使找到 I 帧,I 帧之后的帧还是有可能解析不出来,而 IDR 帧就是一种特殊的 I 帧,即这一帧之后的所有参考帧只会参考到这个 IDR 帧,而不会再参考前面的帧,在解码器中,一旦收到一个 IDR 帧,就会立即清理参考帧缓冲区,并将 IDR 帧作为被参考的帧。

GOP

两个 I 帧之间形成的一组图片,就是 GOP(Group Of Picture)的概念,通常在为编码器设置参数的时候,必须要设置 gop_size 的值,其代表的是两个 I 帧之间的帧数目。前面已经讲解过,一个 GOP 中容量最大的帧就是 I 帧,所以相对来讲,gop_size 设置得越大,整个画面的质量就会越好,但是在解码端必须从接收到的第一个 I 帧开始才可以正确解码出原始图像,否则会无法正确解码(这也是前面提到的 I 帧可以作为随机访问的帧)。

H264Parser

参考 视音频数据处理入门:H.264视频码流解析 的代码和 音视频压缩:H264码流层次结构和NALU详解 对 H.264 格式的详细解读,我编写了 H264Parser 来解析 H.264 视频文件。

FLV

FLV Sequence

FLV 即 Flash Video,是 Adobe 公司推出的一种音视频封装格式,整体的封装格式如上图,通常 Video Tag 装的就是前面讲解 H.264 数据,Audio Tag 装的就是 AAC 数据,可以通过 数字音频、PCM 音频格式和 AAC 音频格式 来了解这些理论知识。

参考 视音频数据处理入门:FLV封装格式解析 的代码,以及 音视频封装:FLV格式详解和打包H264、AAC方案(上)音视频封装:FLV格式详解和打包H264、AAC方案(下) 对 FLV 格式的详细解读,我编写了 FLVParser 来解析 FLV 音频文件。