引入

为何视频可以被压缩

视频压缩的本质,是消除视频信号里的冗余信息,用最少的比特,保留人眼能感知到的有效画面信息。前面我们提过,冗余信息有以下几类:

1.统计冗余 (Statistical Redundancy): 这是指数据本身存在的重复或可预测的模式。有以下三类

  • 空间冗余 (Spatial Redundancy / 帧内冗余 intraframe redundancy):同一幅图像里,相邻像素的颜色和亮度通常非常相似。比如一张蓝天的图片,大片区域的像素值几乎一样。
  • 时间冗余 (Temporal Redundancy / 帧间冗余):这是指时域上的冗余信息(特指视频)。视频是由连续的帧组成的,相邻两帧之间的内容变化通常很小。比如一个人在说话,只有嘴部在动,背景和人脸的大部分区域都是不变的。所以我们不需要存储每帧的完整图像,只需要存储第一帧的完整信息,后续帧只记录和前一帧的差异即可。
  • 编码冗余 (Coding Redundancy):这是指在数据编码时,使用了过长的编码来表示出现频率高的符号。比如在一个图像中,白色像素出现的频率很高,如果我们用固定长度编码来表示所有颜色,就浪费了空间。更高效的做法是用变长编码,给出现频率更高的数据编为更短的编码。

2. 视觉冗余 (Psycho-visual Redundancy):人类视觉系统的局限性,人眼对某些信息不敏感,我们可以在合理范围内丢弃这些信息。

  • 频率掩蔽 (Frequency Masking):人眼对图像中的高频细节(即,图像变化剧烈的地方,比如精细的纹理、锐利的边缘)的噪声或失真不太敏感。所以压缩算法可以对高频信息进行更强烈的压缩,即使丢失一些细节,人眼也很难察觉。
  • 颜色掩蔽 (Color Masking):人眼对亮度(Luma)的变化非常敏感,但对颜色(Chroma)的变化相对不敏感。基于这个原理,压缩时可以大幅降低颜色通道的分辨率,这样能减少大量数据,而人眼几乎看不出区别。

所有的压缩算法,都是围绕这些冗余信息去设计的。

视频的结构

视频编码不是把整个视频当成一整块处理的,而是有严格的从上到下、从大到小的分层结构,几乎所有主流编码标准都遵循这个逻辑,我们逐层拆解:

image-20260329215022582

  • 最顶层:序列(Sequence):也就是一整个视频文件,开头有序列头,结尾有结束码,中间是一个个 GOP。
  • 第二层:GOP(图像组,Group of Pictures):一组连续的画面,是视频拖动进度条、随机访问的基本单位。
  • 第三层:图像(Picture):也就是我们常说的一帧视频,一个 GOP 包含多帧。
  • 第四层:片(Slice):一帧画面会分成多个 Slice,每个 Slice 可以独立解码,传输中某个 Slice 出错,不会影响整帧画面。
  • 第五层:宏块(Macroblock):视频编码最核心的基本处理单元,后面的 DCT 变换、运动估计、运动补偿,都是以宏块为单位完成的。
  • 最底层:块(Block):一个宏块会分成多个 8×8 的块,是 DCT 变换的最小单位。

宏块(Macroblock)详解

首先我们的视频信号,使用的是 YCbCr 色彩空间,也就是分成亮度 Y、蓝色差 Cb、红色差 Cr 三个分量。

image-20260329220238108

在传统标准编码里,一个标准宏块的构成是1 个 16×16 的亮度 Y 分量 + 空间重叠的 2 个 8×8 的色度分量(1 个 Cb、1 个 Cr)。也就是说,在一个宏块内,亮度的分辨率是16x16,但是色彩的分辨率是8x8。这是由于人眼对亮度更敏感。

16×16 的 Y,正好可以分成 4 个 8×8 的 Y 块,如上图所示。加上 1 个 8×8 的 Cb 块、1 个 8×8 的 Cr 块,所以1 个宏块 = 4 个 Y 块 + 1 个 Cb 块 + 1 个 Cr 块

宏块是DCT 变换、运动估计、运动补偿的基本单位,我们后面讲的运动矢量,就是给每个宏块计算的。

视频的压缩原理

帧间压缩(Intraframe Compression)

视频压缩比图像压缩更进一步的是消除时间冗余,即帧间压缩。其核心逻辑是:相邻两帧大部分内容只有位置变化,没有内容变化,我们不用完整编码第二帧,只需要编码「块的移动距离」+「移动后和实际画面的微小差值」就可以了。

这需要:

运动估计(Motion Estimation):给当前要编码的宏块,在已经编码好的参考帧里,找到最相似的块,计算两个块之间的位移,这个位移就是运动矢量(MV)。比如参考帧的块向右移 1 像素、向上移1 像素,就到了当前宏块的位置,那运动矢量就是 (1,-1)。

运动补偿(Motion Compensation):用算出来的运动矢量,把参考帧的块移动过来,生成当前宏块的预测块,然后只编码当前宏块和预测块的差值(残差)。因为残差大部分都是 0 或者极小的数值,编码残差比编码完整宏块,能节省几十倍的比特,这就是帧间压缩高压缩比的核心。

image-20260329221928008

帧内压缩 & 帧间压缩(Intraframe & Interframe Compression)

许多视频压缩算法,例如MPEG,同时使用了帧内压缩与帧间压缩。

类型 帧内压缩(Intraframe) 帧间压缩(Interframe)
核心逻辑 把每一帧当成静态图片处理,不参考其他帧(例如MPEG的I帧) 利用相邻帧的时间相关性,参考已编码帧压缩当前帧(例如MPEG的P 帧(预测帧)、B 帧(双向预测帧))
消除的冗余 空间冗余 时间冗余
核心技术 帧内预测、DCT 变换、量化(和 JPEG 逻辑一致) 运动估计、运动补偿
特点 可独立解码,是随机访问的基础,压缩比低 无法独立解码,依赖参考帧,压缩比极高

亮度与色度(Luminance (Luma) & Chrominance (Chroma))

为什么视频编码要把 RGB 转换成 YCbCr?

因为 RGB 三个通道,人眼的敏感度是相近的,而转换成 YCbCr 之后,我们把人眼最敏感的亮度 Y,和不敏感的色度 Cb/Cr 分离开,就可以对色度分量做针对性的压缩,在人眼完全察觉不到画质下降的前提下,大幅减少数据量。

例如这个例子:

image-20260329222528774

首先我们先介绍$ 4:x:x $三个数字的含义:

  • 第一个数字 4:固定为水平方向的亮度采样数,作为参考基准;「我们以连续 4 个 Y 像素为一个小组」,来对比色度的数量
  • 第二个数字:所有奇数行(第 1、3、5、7…… 所有单数行)里,和上面说的「4 个连续 Y 像素」在同一水平位置上,有多少个 Cb/Cr 像素。
  • 第三个数字:所有偶数行(第 2、4、6、8…… 所有双数行)里,和上面说的「4 个连续 Y 像素」在同一水平位置上,有多少个 Cb/Cr 像素。
  1. 4:4:4:无任何子采样,每个 Y 像素都对应一组 Cb/Cr,无色度压缩
  2. 4:2:2:水平方向子采样,对于奇数行每 4 个 Y 对应 2 个 C;对于偶数行每 4 个 Y 对应 2 个 C。水平色度分辨率减半;
  3. 4:2:0:水平 + 垂直方向都子采样。对于奇数行每 4 个 Y 对应 2 个 C;对于偶数行,不单独采样新的 Cb/Cr,直接复用上面奇数行的色度。像素色度水平、垂直分辨率都减半;
  4. 4:1:1:水平方向子采样。对于奇数行每 4 个水平 Y 采样对应 1 组 Cb/Cr;对于偶数行也是。因此水平方向每一行的4个亮度像素对应一个色度像素。

其中,4:2:2和4:2:0是主流格式的采样规则

视频压缩的发展史

三大国际标准化组织

缩写 全称 核心目标领域
ISO International Organization for Standardization(国际标准化组织) 工业产品通用标准
IEC International Electrotechnical Commission(国际电工委员会) 电气工程、电子技术
ITU International Telecommunication Union(国际电信联盟) 无线、电气通信领域

两大标准体系的制定主体

  • MPEG 系列:由ISO+IEC联合成立的MPEG(动态图像专家组)制定,核心面向数字存储、多媒体播放(如 VCD、DVD、网络视频);
  • H.26x 系列:核心由ITU制定,早期面向视频通信(如视频电话、会议);后期核心标准(H.262/264/265/266)是 ITU 与 ISO/IEC 联合制定,实现了两大体系的融合,这也是为什么 H.262 也叫 MPEG-2,H.264 也叫 MPEG-4 AVC 的原因。

MPEG标准

MPEG基础

MPEG 的全称是动态图像专家组(Moving Picture Experts Group),它的核心目标,就是对视频信号做高效的编码压缩。MPEG 标准的两大技术底座,就是:

  1. DCT 编码:通过离散余弦变换消除帧内空间冗余,也就是帧内压缩,逻辑和 JPEG 完全一致;
  2. 运动估计与补偿:消除帧间时间冗余,也就是帧间压缩,这是 MPEG 实现高压缩比的核心。

同时 MPEG 标准默认的视频源,绝大多数商用场景都采用4:2:0 色度子采样格式

MEPG的视频结构

image-20260330204237747

整个视频序列会被切分成一个个独立的 GOP,每个 GOP 都是一个可以独立解码、独立随机访问的单元。通俗说,你拖动视频进度条,播放器会直接定位到对应 GOP 的开头,不用从头解码整个视频,这就是 GOP 的核心作用。

每个 GOP 的开头一定是 I 帧,结尾通常也以 I 帧收尾,中间是 P 帧和 B 帧。

无论是I,B还是P帧,都是由片构成,每个片由宏块构成,每个宏块包含16x16的明度数据与8x8的Cr,Cb数据。

GOP与I, P, B帧

一个GOP的典型帧构成如下图所示

image-20260330204923936

I 帧(Intra-coded frames,帧内编码帧):完全采用帧内压缩,不参考任何其他帧,自身就能独立解码。编码逻辑和 JPEG 完全一致,对 Y、Cb、Cr 块单独做 DCT、量化、熵编码,仅消除空间冗余。

P 帧(Predictive-coded frame,前向预测帧):属于帧间编码帧,只能用前面已经解码完成的 I 帧或 P 帧(锚帧)作为参考,通过运动估计与补偿,仅编码预测后的残差数据。由于P帧是基于前帧参考的,因此残差数据的误差将会随着P帧一次次参考进行传播,这就是P帧的Error popagation。为了减小这种error,需要在合适的地方重新插入i帧。

B 帧(Bidirectional-coded frame,双向预测帧):同样是帧间编码帧,也是压缩比最高的帧类型,既可以用前面的过去帧做参考,也可以用后面的未来帧做参考,在对B的宏块进行运动预测时寻找到最相似的新宏块更高,残差数据有更多的0,因此压缩比通常高于P

在一个GOP中:

  • 压缩比最大B 帧。因为它支持双向参考,能最大程度消除时间冗余,需要编码的残差数据极少,甚至很多 B 帧的残差全为 0,仅需编码运动矢量,压缩比最高、码率最低。
  • 压缩比最小I 帧。因为它完全不参考其他帧,仅能消除空间冗余,需要编码整帧的所有 DCT 系数,没有帧间压缩的增益,所以压缩比最低、码率最高。
  • P 帧的压缩比永远介于 I 帧和 B 帧之间。

如何选择一个GOP的大小?

在上面GOP的图中,右上角有一个N=9,M=3,其意义是:

  • N:GOP 长度,也就是一个 GOP 包含的总帧数,这里 N=9 代表一个 GOP 有 9 帧;
  • M:锚帧间隔,也就是两个参考帧(I/P 帧,也叫锚帧)之间的帧数,这里 M=3 代表每 3 帧设置一个 P 帧,中间插入 2 个 B 帧。

  • 压缩比:GOP 越大,整体压缩比越高。因为 GOP 越大,I 帧的占比越低,更多帧可以用高压缩比的 P/B 帧编码,整体码率更低。

  • 画质:GOP越大,P帧间的误差传输会更大,会导致画面误差越来越大
  • 随机访问 / Seek 性能:GOP 越小,进度条拖动的响应越快。比如视频网站、短视频平台,用户频繁拖动进度条,GOP 通常设为 1-2 秒;电影这类很少拖动的内容,GOP 可以设为 5-10 秒。

IBP的编码顺序

由于B 帧的存在,导致视频的编码 / 传输顺序,和我们看到的显示顺序完全不同。B 帧需要参考后面的未来 P 帧,如果我们按显示顺序编码,编到 B 帧的时候,后面的 P 帧还没编码、也没解码,根本拿不到参考数据。所以为了让 B 帧能获取未来的参考帧,编码器必须先编码后面的 P 帧,再回头编码中间的 B 帧,这就是顺序颠倒的核心原因。

下图是一个差异的例子:

image-20260330205249071

  • 显示顺序(人眼看到的播放顺序):I B B P B B P B B I
  • 编码 / 传输顺序:I P B B P B B I B B

运动估计与补偿

时间冗余的本质,是相邻帧的内容大多只有位置移动,没有内容变化。所以我们不用编码完整的帧,只需要编码两个信息:

  • 这个块从哪里移动过来的 ——运动矢量(MV)
  • 移动后和实际画面的差值 ——残差

这其中有两个核心过程:

运动估计(Motion Estimation,ME):是「找」的过程。给当前要编码的宏块,在参考帧里找到最匹配的块,计算出两者的位移,也就是运动矢量 MV。编码过程中 90% 以上的计算量,都花在运动估计上

运动补偿(Motion Compensation,MC):是「算」的过程。用找出来的 MV,把参考帧的块移动过来,生成当前宏块的预测块,再计算当前块和预测块的差值(残差)。我们最终编码的,就是这个残差,而非完整宏块。残差的数值大多极小,甚至全为 0,编码残差需要的比特数,比编码完整宏块少几十倍,这就是帧间压缩的核心魔力。

运动估计(Motion Estimation)

运动估计的搜索窗口

运动矢量的搜索,不是在整帧里无限制查找,那样计算量会爆炸。

我们要编码的,是目标帧里一个 N×N 的宏块(N 通常为 16,也就是标准 16×16 宏块);我们在参考帧里,以这个宏块的对应位置为中心,划定一个搜索窗口,窗口大小为(2p+1)×(2p+1),p 就是搜索范围,水平和垂直方向的位移,都限制在[-p, +p]的区间内。

image-20260330212418209

p 越大,能找到的匹配块越精准,压缩比越高,但计算量也越大;p 越小,计算越快,但可能找不到最优匹配块,残差变大,压缩比下降。

ME匹配准则:MAD 公式

我们怎么量化判断,参考帧里的哪个块和当前宏块 “最匹配”?行业最通用的标准,就是 平均绝对差(Mean Absolute Difference,MAD)

其中:

  • N:宏块的尺寸,16×16 宏块的 N=16;
  • (k,l):宏块中的像素索引;
  • (x,y):当前宏块在目标帧的左上角坐标;
  • (i,j):当前测试的水平 / 垂直位移,也就是候选运动矢量;
  • C(x+k,y+l):当前宏块里的每个像素值;
  • R(x+i+k, y+j+l):参考帧里,位移 (i,j) 后的候选块的对应像素值。

MAD 就是两个块所有对应像素的差值的绝对值,求平均值。MAD 越小,两个块的相似度越高,匹配度越好。所以目标就是找到$MV=(u,v)$,$MAD(u,v)$最小。

不难看出,在进行MAD比对时,是逐像素比对的。得到的[i,j]是水平 / 垂直方向上的像素偏移量,并非偏移的宏块

我们说对比的单位是宏块,是因为算法不去算单个像素差,而是把 整个 16×16 的区域 挪过去,和原图的每一个像素做差,取平均。所以结果 MAD(i,j) 衡量的是 整个宏块 的相似度。所以逻辑是:把整个 16×16 的块,按像素精度挪到 (i,j) 的位置,算一下和原图差多少。

进行运动估计时的关键考量因素

在执行ME匹配时,要找的是reference frame内匹配度最高的块。

  • 计算复杂度:如果将匹配window设置得太大,或者宏块太大,则匹配速度会非常慢
  • 精度:如果window太小,则有可能匹配到不太像的像素块,这会导致残差过大,压缩比变小。

主流的运动估计算法:

全搜索(Full Search):把搜索窗口里的每一个可能的位移点,全部计算一遍 MAD,找到 MAD 最小的点,就是最优 MV。

  • 匹配精度最高,压缩比最好
  • 计算量极大,速度极慢

三步搜索(Three-step Search):从大到小、逐步缩小搜索范围,三步锁定最优解,避免全窗口遍历。

image-20260330215750014

  1. 以搜索窗口中心为原点,步长设为 4(p 的一半左右),搜索 9 个点(中心 + 8 个方向的步长点),找到 MAD 最小的点,作为下一步的中心。
  2. 步长减半为 2,以上一步的最小点为中心,再搜索 9 个点(上图中第一步左下角的点),找到 MAD 最小的点,作为第三步的中心。
  3. 步长再减半为 1,再搜索 9 个点,最终找到的 MAD 最小点,就是最终的运动矢量。
  • 优点:计算量极小,速度极快。
  • 缺点:只能找到局部最优解,很容易错过全局最优匹配点,因此精度差,压缩比低。

二维对数搜索(2D Logarithmic Search,2D-Log):二维对数搜索是介于全搜索和三步搜索之间的算法,核心思路是像爬山一样,一步步往 MAD 更小的方向移动,直到找到谷底,也叫 “爬山法”。

image-20260330220558827

  1. 以搜索窗口中心为原点,步长设为 p 的一半,搜索 5 个点(中心 + 上下左右 4 个方向),找到 MAD 最小的点。
  2. 如果最小点是中心,说明已经在谷底附近,把步长减半;如果最小点是四个方向中的一个,就把中心移到这个点,步长不变,继续搜索 5 个点。
  3. 重复第二步,直到步长缩小到 1,此时搜索 3×3=9 个点,找到的最小点就是最终 MV。

分层搜索(Hierarchical Search):分层搜索也叫多分辨率搜索,是现在工程上应用最广的算法,核心思路是从低分辨率到高分辨率,逐层缩小搜索范围,既保证精度,又大幅降低计算量,完美解决了局部最优的问题。

MPEG-1

引入

MPEG1是1992 年 11 月由 ISO/IEC 制定,首个有损音视频联合压缩标准,核心目标是1.5Mbps 码率下的数字存储媒体编码(最典型应用:VCD 光盘);

它是 JPEG(静态图像)+ H.261(早期视频通信) 的扩展,核心继承了 JPEG 的 DCT 编码和 H.261 的宏块、运动估计思想;仅支持逐行扫描(progressive scan),不支持隔行扫描,这是早期标准的局限性;

色度采样为4:2:0(16×16 Y + 8×8 Cb/Cr)。

MPEG-1 的官方编号是ISO/IEC 11172,分为5 个部分,各司其职:系统(System)、视频(Video)、音频(Audio)、一致性测试(Conformance)、参考软件(Reference Software)

MPEG-1 的缺点有如下:(也是它被后续 MPEG-2 取代的原因)

  1. 仅支持逐行扫描:无法适配早期的广播电视隔行扫描制式,应用场景受限;
  2. 画面质量低:分辨率仅 352×240/288,远低于后续的标清 / 高清,VCD 的模糊画质就是这个原因;
  3. 压缩比低:相比后续标准,相同码率下画质更差,相同画质下码率更高,硬件存储和传输成本高。

MPEG1:I,P,B帧编码

i帧编码

I 帧是帧内编码帧,编码逻辑完全基于 JPEG,无任何帧间参考:

image-20260330223901538

P帧编码

P 帧是前向预测帧,是帧间编码的核心,基于前面的 I/P 帧做运动估计与补偿,仅编码残差。下面是编码流程图:

image-20260330224600939

  1. 上图左侧网格里的 $M_T$(Macroblock Target),就是当前要编码的 16×16 宏块。下方网格是已编码的前序 I/P 帧,我们在里面搜索和$M_T$ 最相似的宏块,找到的最佳匹配块叫 $M_R$(Macroblock Reference)
  2. 计算它们之间的运动矢量V
  3. 计算$M_D=M_T−M_R$,$M_D$叫残差宏块(Difference Macroblock)
  4. 然后进入右侧的编码流程,首先把残差从像素域转到频率域,把能量集中到低频系数,消除空间冗余。
  5. 对于运动矢量V,因为相邻宏块的运动矢量高度相关,我们只编码当前 V和相邻宏块 V 的差值,而非完整 V,大幅减少数据量。
  6. 最后将差分编码后的V与$M_D$一起进行霍夫曼编码,成为编码码流(Encoded bitstream)

P帧的精度损失就来源于对$M_D$进行JPEG同样流程的压缩这里,在量化时,忽略了很多高频分量。这个精度损失会随着P帧进行传播。

下图是完整的DCT编码框图:

image-20260330230055831

在上图中值得注意的是,在宏块进行了DCT,量化(Q)之后,有一路解量化(DQ)和逆DCT链路,他们会生结构当前帧作并存入Reference Frame。这是因为P frame无法单独访问,因此下一帧P帧要用这一帧作为参考时,必须依赖上一帧编码时存入的Reference Frame。所以解量化(DQ)和逆DCT链路在编码器中也是有必要的。

在MPEG-1中,使用绝对差总和(Sum of Absolute Difference SAD)进行运动估计。

  • 如果SAD小于阈值,则匹配成功,匹配成功的宏块会被确定V和$M_D$
  • 如果未找到匹配,则将宏块独立编码,像I帧中的宏块处理方式一样。

B帧编码

为何要进行B帧编码?

考虑这样一个情景:一个圆从长方形遮挡中跳出来。中间这一帧是当前需要被编码的帧。

image-20260330231313239

对于上图中黑色方框框起来的MB,在前向帧中无法找到对应的部分,但在后向帧中可以。因此,使用B帧编码可以大幅提高找到对应宏块的概率。

如何编码

考虑下面这样一个例子,对于当前的宏块,在前向帧和后向帧中分别找到了一个最匹配的块。

image-20260330231708386

  1. 首先,基于前序参考帧的匹配宏块,生成第一组残差$M_D$
  2. 基于后序参考帧的匹配宏块,生成第二组残差$M_D$
  3. 接下来,计算两个最匹配之间的平均值,在用当前的块减去他们的平均值,得到第三组残差$M_D$。
  4. 从 3 组残差中选择像素差值最小的一组,按 P 帧的编码流程处理(FDCT→量化→熵编码),同时编码对应的1 个或 2 个运动矢量

下图是B帧的编码流程图:

image-20260330232301040

典型帧大小与压缩比

帧类型 典型大小 压缩比
I 帧 18kB 7:1
P 帧 6kB 20:1
B 帧 2.5kB 50:1
平均 4.8kB 27:1

MPEG-1的bitstream结构

image-20260330232648511

  1. 一个Video Sequence由Header+ GOPs+end code构成。 Header包含一些控制信息。
  2. GOP由很多帧图像组成,这些图像可以I,B,P帧
  3. 不同帧可以分为片,片由MB组成
  4. 每个MB由 帧内块的 DC 系数(差分编码后)+ 游程可变长度编码(Variable Length Coding) + 块结束标记,标识当前块编码完成。

之前讲的是霍夫曼编码,但是这里变成了游程编码,为啥我也不知道。反正都是熵编码吧……→_→

MPEG-2

引入

MPEG2升级初衷:彻底解决 MPEG-1 的两大核心缺陷 —— 仅支持 1.5Mbps 低码率、仅支持逐行扫描;

MPEG2面向数字广播电视(DTV)(兼顾 DVD 存储),支持广播电视主流的隔行扫描,码率提升至4Mbps;

同时,有两大核心创新:

  • 定义Profiles(配置文件)+ Levels(级别),让一个标准适配从民用到专业的多场景;
  • 支持可伸缩编码(Scalable Coding),这是 MPEG-2 最核心的技术亮点,也是和 MPEG-1 的本质区别之一。

MPEG2继承 MPEG-1 的 5 个基础部分(功能完全复用),新增 3 个专业级部分

  1. Systems(系统层)—— 音视频同步、码流封装,保证音视频同步播放;
  2. Video(视频层)—— 核心视频编码算法
  3. Audio(音频层)—— 基础音频编码,兼容 MPEG-1 音频;
  4. Conformance(一致性测试)—— 规定标准测试方法,保证不同厂商设备兼容;
  5. Reference software(参考软件)—— 提供官方编解码参考程序,供厂商开发。
  6. DSM CC(数字存储媒体命令与控制):适配 DVD 等数字存储设备的交互控制,比如光盘导航、菜单操作、章节跳转,是 DVD 能实现人机交互的核心;
  7. AAC(高级音频编码):替代 MPEG-1 的基础音频编码,实现更高音质、更高压缩比的音频编码,至今仍是音乐、视频的主流音频编码标准;
  8. RTI(实时接口):适配数字广播电视的实时传输需求,解决编解码的实时性问题,保证广播信号的实时编码与传输。

Profile & Levels

由于不同的应用场景需求不同,MPEG2通过Profiles(功能集)+ Levels(性能上限)的组合,让同一个编码标准适配从民用 DVD 到专业影视制作的所有场景。

下表是不同的profile支持的level,例如simple profile就只支持main和low两个level的性能参数。

Level Simple profile Main profile SNR scalable profile Spatially scalable profile High profile 4:2:2 profile Multiview profile
High * * *
High 1440 * * * *
Main * * * * * *
Low * * *

下表是不同level对应的性能

Level Resolution Maximum fps Maximum pixels/sec Maximum coded data rate (Mbps) Application
High 1,920x1,152 60 $62.7×10^6$ 80 Film production
High 1440 1,440x1,152 60 $47.0×10^6$ 60 Consumer HDTV
Main 720 x 576 30 $10.4×10^6$ 15 Studio TV
Low 352 x 288 30 3.0×10⁶ 4 Consumer

MPEG-2 可伸缩编码(Scalable Coding)

为什么,是什么

可伸缩编码是只通过编码的方式,让用户可以动态地选择视频数据量。

可伸缩编码是为了解决:

  • 网络码率差异极大:比如有的用户是低带宽宽带,有的是高带宽光纤;
  • 网络码率动态变化(VBR):比如移动广播、无线电视的带宽会随位置 / 信号波动;
  • 网络存在噪声 / 误码:比如无线广播电视的信号容易受环境干扰,出现比特错误。

实现原理

可伸缩编码的实现原理是将视频编码为不同的层。

  • 基础层(Base Layer):最核心的编码层,可独立编码、独立传输、独立解码,解码后能得到基础画质的视频(画质低,但能正常观看,保证 “能看” 的底线);
  • 增强层(Enhancement Layer)1 个或多个,完全依赖基础层 / 前一个增强层,不能独立编解码,解码后能在基础层的基础上提升画质 / 分辨率 / 帧率;

传输 & 解码规则:先传基础层码流,让用户快速获得基础视频;再传增强层码流,根据用户的网络带宽 / 设备性能动态选择是否接收—— 带宽高则接收增强层,获得更高画质;带宽低则放弃增强层,仅看基础层。

image-20260331000928942

MPEG2可伸缩的类型

image-20260331111820064

MPEG2伸缩性的基础类型有:

  • 空间拓展性(Spatial scalability): 视频的分辨率可伸缩

    • 基础层编码:先把原始高分辨率的视频帧,通过下采样(降分辨率)得到低分辨率画面,只对这个低分辨率画面做编码,独立解码就能得到低清视频;
    • 增强层编码:把基础层解码重建的低清画面,做上采样还原到原始分辨率,再和原始高分辨率帧做差,对这个残差做编码,就得到了增强层码流;
    • 解码端:基础层的低清画面,加上增强层的残差信息,就能还原出原始的高分辨率视频。

    image-20260331114150329

  • 时间拓展性(Spatial scalability):视频的帧率可伸缩

    • 视频拆分:把原始输入的视频,在时间维度上解复用,拆成两路帧率减半的序列。比如原始 30 帧 / 秒的视频,拆成两路 15 帧 / 秒的序列;
    • 基础层编码:对其中一路 15 帧 / 秒的序列,做常规的单层编码(I+B+P),正常就能得到 15 帧的基础流畅度,保证视频能正常播放;
    • 增强层编码:对另一路 15 帧 / 秒的序列做编码,但是它的运动补偿(B+P)、编码过程必须依赖基础层的帧,无法独立编码;
    • 解码端:把基础层的 15 帧,和增强层的 15 帧合并,就能还原出 30 帧 / 秒的原始高帧率视频,画面流畅度直接翻倍。

    image-20260331114330800

  • 质量拓展性(Spatial scalability)/SNR 可拓展性: SNR 就是信噪比,信噪比越高,视频的画面噪声越少,画质越清晰。SNR 可分级,就是在不改变视频分辨率、帧率的前提下,只提升画面的清晰度。

    • 基础层编码:对视频帧的 DCT 系数做粗量化—— 量化步长很大,所以编码出来的码流体积很小,但是画质偏低,只能保证基础的画面轮廓;
    • 生成残差:把基础层里粗量化的 DCT 系数做反量化,和原始的 DCT 系数做差值计算,得到残差数据;
    • 增强层编码:对这个残差做细量化,得到 DCT 系数的修正值,这就是增强层的码流;
    • 解码端:把基础层的粗量化系数,加上增强层的修正系数,就能还原出高精度的 DCT 系数,最终得到高信噪比、高清晰度的视频画面。

image-20260331112646250

混合可分级(Hybrid Scalability):这个非常好理解,就是把上面三个基础类型里的任意两种组合起来,就叫混合可分级。

  • 空间 + 时间混合可分级:同时提升分辨率和帧率
  • SNR + 空间混合可分级:同时提升画质和分辨率
  • SNR + 时间混合可分级:同时提升画质和帧率

数据分区(Data Partitioning):把视频帧量化后的 DCT 系数,拆成两个分区。基础分区放低频 DCT 系数(决定画面的主体轮廓),增强分区放高频 DCT 系数(决定画面的细节纹理)。

MPEG2相较于MPEG1的优势

对比维度 MPEG-2 MPEG-1
同码率画质 更优,压缩效率更高 基础画质,压缩效率偏低
扫描模式 同时支持逐行、隔行扫描 仅支持逐行扫描
可分级编码 支持,核心特性 完全不支持
抗误码能力 强,适配噪声大、不可靠的网络 弱,仅适合稳定的存储介质
色度子采样 支持 4:2:0、4:2:2、4:4:4,色彩还原更好 仅支持 4:2:0,色彩精度有限
格式兼容性 支持从标清到 HDTV 的全分辨率,适配 DVD、数字电视 仅支持低分辨率,仅适配 VCD 等介质

MPEG-4

MPEG4诞生于1998 年 10 月,是互联网萌芽、移动通讯起步的关键节点,天生为网络传输而生。

码率覆盖范围:5 kbps ~ 10 Mbps,这个是它的核心竞争力之一。

MPEG4它是 MPEG 系列里,从 “编码压缩工具” 到 “多媒体内容处理框架” 的一次革命性升级。

MPEG-1/2 的块基编码:不管视频里有什么内容,统一把每一帧画面切成 16×16 的宏块,按块做 DCT 变换、量化、压缩。它眼里只有 “像素块”,没有 “画面内容”,你只能对整个视频帧做处理,无法单独操作画面里的某一个元素。

MPEG-4 的对象基编码:它把一整个音视频场景,拆成了一个个独立的视听对象(AV Object)。比如一个新闻视频里,主持人、背景画面、字幕条、背景音乐、旁白,都可以是独立的对象。VOP(Video Object Plane,视频对象平面),就是视频对象的基本单元 —— 一个视频对象在某一时刻的一帧画面,就是一个 VOP。比如主持人这个视频对象,25 帧 / 秒的视频里,每一秒就对应 25 个 VOP,每个 VOP 都可以独立编码、独立处理。

这个从 “块” 到 “对象” 的升级,直接带来了核心优势:数字视频的合成、编辑操作、索引与检索。你可以单独移动主持人的位置、替换背景、关掉背景音乐、放大字幕,而不需要重新编码整个视频,这是 MPEG-1/2 完全做不到的。

MPEG4优势:

  • 将自然内容与合成内容与对象的形式整合
  • 支持2D、3D内容,以及更好的用户互动性
  • 编码速率可变范围到(极低:2Kbit/s(语音)5Kbit/s(视频);极高:5Mbit/s(视频),64Kbit/s(每通道音频))
  • 支持知识产权管理和保护

MPEG-7

MPEG7不是视频编码标准,而是基于音视频内容的描述、索引和检索标准。它的正式名称叫Multimedia Content Description Interface(多媒体内容描述接口)

H.26X标准

标准的发展历史

回顾前面的介绍,H.26X标准核心由ITU制定,早期面向视频通信(如视频电话、会议);后期核心标准(H.262/264/265/266)是 ITU 与 ISO/IEC 联合制定,实现了两大体系的融合,这也是为什么 H.262 也叫 MPEG-2,H.264 也叫 MPEG-4 AVC 的原因。

下图是各个常见标准的发展时间轴

image-20260331142756270

年份 标准 核心开发团队 里程碑意义
1990 H.261 ITU-T VCEG 奠定所有后续视频编码的核心框架
1995 H.262/MPEG-2 ITU-T+MPEG 联合 普及 DVD、数字广播电视,新增 B 帧
1996/1998 H.263/H.263+ ITU-T VCEG 低码率视频会议优化,亚像素运动估计
2003 H.264/AVC 联合团队 JVT 压缩效率翻倍,全场景普及的里程碑
2013 H.265/HEVC 联合团队 JCT-VC 适配 4K/8K 超高清,压缩效率再提升 50%
2020 H.266/VVC 联合团队 JVET 面向 HDR、360° 全景视频,压缩效率再升级

H.261标准

引入

H.261 是整个 H.26x 系列的鼻祖,1990 年由 ITU-T 制定,设计目标非常明确:面向窄带网络的视频会议和视听服务。其压缩原理是基于运动补偿(motion compensation MC)(这个运动补偿其实就是前面的残差编码),这个原理是后续每一代H.26X标准的基石。

H.261支持的色度下采样是YUV 4:2:0。支持的格式入下表:

Video format Luminance image resolution Chrominance image resolution Bitrate (Mbps) (if 30 fps and uncompressed) H.261 support
QCIF 176 × 144 88 × 72 9.1 Required
CIF 352 × 288 176 × 144 36.5 Optional

H.261:帧序列

H.261 只定义了两种帧类型,也是视频编码最基础的两类帧:

  • I 帧(帧内编码帧):把这一帧当成一张独立的静态图片编码,不参考任何其他帧。
  • ‘’P 帧(前向预测帧):必须参考它前面的 I 帧或 P 帧来编码,只编码当前帧和参考帧的差异部分。

image-20260331143610201

I帧编码

I帧编码与JPEG非常类似:

  • 一个MB包含4个8x8的Y,1个$C_b$,1个$C_r$
  • 对这6个8x8矩阵分别进行DCT、量化、zigzag扫描、熵编码

image-20260331144944384

P帧编码

P帧编码与MPEG1类似:

  • 对于目标帧种中的每个MB,通过搜索方法(search method)估计运动向量
  • 计算残差宏块$M_D$,将$M_D$中的8x8块执行DCT、量化、zigzag扫描和熵编码
  • 对运动矢量的差值(Motion vector difference MVD)(即,前面提到的差分编码)做熵编码,和残差码流一起发给解码器。

image-20260331145246435

H.261:量化

JPEG的量化和H.261的有差异。

对于H.261同一个宏块内的所有 DCT 系数,使用固定的量化步长:同一个宏块内的所有 8×8 块、所有 DCT 系数,均使用相同的量化步长,无位置差异化步长,该设计的核心是简化计算,适配早期视频会议设备的低算力,保证实时编码 / 解码。

  • i帧的 DC 系数(8×8 块 DCT 后的第一个系数,代表块的平均亮度),量化步长固定为 8;

  • 其他 AC 系数,量化步长 = $2\times scale$,scale 是 1-31 的整数,scale 越大,量化越狠,码率越低,画质越差,反之亦然。

H.261 是早期的标准,所以对于量化表,大多数时候他们对所有量化都使用常数值。量化表中的所有值都相同。

H.262标准与H.263即现代标准

H.262

H.262就是前面介绍的MPEG2,由 ITU-T Study Group 16 Video Coding Experts Group (VCEG)和 ISO/IEC Moving Picture Experts Group (MPEG)联合制定。

它相比 H.261,最核心的升级就是新增了 B 帧(双向预测帧)。B 帧不仅可以参考前面的 I/P 帧,还可以参考后面的 I/P 帧做双向预测,压缩率比 P 帧还要高。

H.263

H.263 在 1996 年标准化,H.263 + 在 1998 年推出,目标还是低码率下的视频会议,相比 H.261,它能在更低的码率下实现更好的画质,也是 MPEG-4 Part 2 的开发基础。

H.263 核心优化

  1. 支持更多分辨率格式,从极低分辨率的 sub-QCIF(128×96),一直到 16CIF(1408×1152),适配性大幅提升;

    image-20260331151544959

  2. 运动矢量精度升级到亚像素级别,最高 1/2 像素精度,H.263 + 更是提升到 1/8 像素精度。亚像素运动估计,就是匹配位置可以是像素之间的插值点,预测更准,残差更小,压缩率和画质都有明显提升。

H.263 + 核心优化

  1. 增加了格式灵活性,支持更多源格式、画面宽高比,适配更多设备;
  2. 支持可伸缩编码,包括时间、画质、空间可伸缩,一次编码就能输出不同帧率、不同画质、不同分辨率的码流,适配不同的网络带宽和设备;
  3. 新增环内去块滤波,减少 DCT 块编码带来的方块效应(也就是画面里的马赛克),大幅提升主观画质。

现代商用主流:H.264、H.265、H.266

这三个标准,是我们现在日常接触最多的,也是两大组织联合开发的集大成之作,每一代都实现了压缩效率的翻倍升级。

  • H.264/AVC:联合团队 JVT,2003 年发布
  • H.265/HEVC:联合团队 JCT-VC,2013 年发布
  • H.266/VVC:联合团队 JVET,2020 年发布

它们的核心目标一脉相承,始终围绕两点:

  1. 持续提升编码效率:每一代都比上一代提升约 50% 的压缩效率 —— 同样的画质,码率只有上一代的一半;
  2. 适配新兴视频应用:从 HD 高清,到 4K/8K 超高清,再到 HDR 高动态范围、360° 全景视频、VR/AR 等场景。

H.264标准

H.264:引入

H.264由 ITU-T 视频编码专家组(VCEG)与 ISO/IEC 动态图像专家组(MPEG)联合制定,2003 年正式标准化。也被称为高级视频编码(Advanced Video Coding, AVC)或 MPEG-4 Part10。

其压缩效率相比 H.262/MPEG-2 最高提升 50%,相比 H.263 最高提升 30%。通过可变块大小、多参考帧技术,大幅提升运动补偿性能。

应用场景:互联网视频、计算机多媒体、高清电视(HDTV)广播、蓝光光盘、移动便携设备。

下图是H.264编码器的流程框图:

image-20260331153008721

  1. 输入处理:和 H.261 一致,将视频流拆成MB,依然以 16×16 宏块为基本编码单元,但后会介绍H.264 的宏块可以拆分成更精细的块,适配不同的视频内容。
  2. 生成运动向量:将当前输入的MB与前向参考进行Motion Estimation,得到运动向量V,运动向量V会被编入最终码流。
  3. 运动补偿:V除了被编入码流外,还会传入运动补偿模块。
  4. 整数变换:残差宏块这次不是进行DCT,而是进行整数变换
  5. 量化与缩放:将整数变换的结果进行量化和缩放,最终编入码流
  6. 逆量化与逆变换分支:将帧重新解析,并叠加上一次的参考帧,然后执行块滤波,生成当前帧的图像作为参考帧。

H.264:主要特性

  1. 基于 4×4 块的整数变换:H.264 使用整数近似的离散余弦变换 (DCT),但块大小为 4×4。计算复杂度低,无预测漂移问题,避免了浮点运算带来的累积误差,因此不会产生预测漂移问题。
  2. 可变块大小的运动补偿:亮度分量支持从 16×16 到 4×4 的多种块尺寸。对于大块适合平坦区域,可以减少比特开销。小块适合边缘或运动复杂区域,提高预测精度。
  3. 运动矢量支持1/4 像素精度,通过插值算法实现。
  4. 多参考帧运动补偿:可使用多个已编码的参考帧做运动预测,而不是仅限于前一帧。
  5. 帧内编码采用方向性空间预测:在帧内预测时,利用相邻像素的方向性信息(水平、垂直、对角线等)来预测当前块。可以更好地利用图像的空间相关性,减少残差,提高压缩效率。
  6. 环内去块滤波:消除由于变换带来的块效应(马赛克)。
  7. 支持 上下文自适应变长编码(CAVLC)上下文自适应二进制算术编码(CABAC) 两种熵编码算法。
  8. 对数据错误和数据丢失具备更强的鲁棒性。
  9. 采用混合编码框架,核心包括:
    • 帧内空间预测
    • 帧间运动预测
    • 残差数据的变换编码

H.264:运动补偿(Motion Compensation)

这个运动补偿其实就是前面的残差+运动向量编码

可变的块大小的运动补偿

在 H.264 中,一个宏块默认是 16×16 像素的亮度块 (Y),同时对应 8×8 的色度块 (Cb、Cr)。H.264 的运动补偿不再局限于固定的 16×16 宏块,而是允许灵活划分为更小的块。这种设计让编码器在处理视频时能更精细地适应不同区域的运动特性,从而显著提升压缩效率和画质。

  • 大块 (如 16×16) 适合运动比较均匀的区域,减少比特开销。
  • 小块 (如 4×4) 适合运动复杂或边缘区域,提高预测精度。
  • 灵活划分使得编码器能在压缩率和画质之间取得平衡。

image-20260331163231508

M Types(宏块级分区):直接对一个 16×16 宏块进行划分。可划成16×16,8×16,16×8,8×8

8×8 Types:针对宏块内部的 8×8 子块进一步细分,粒度更细。

无论是M types还是8x8 Types,最后在处理时,都会分割成4x4的矩阵。

亚像素级别的补偿

  • 亮度分量的运动补偿精度为1/4 像素精度
  • 半像素和 1/4 像素位置的像素值,通过插值算法计算得到。

举个例子来看,下图的每一个灰色方格(如ABCD这四个方格)代表一个像素。假设现在有一个1x2的块,它当前在RT的位置,上一帧内刚好对应AC两个像素,那么它的运动矢量就是(0,4),是个整数,移动的最小单位是像素。

image-20260331163904507

然而,在真实的视频中,每一帧画面物体的移动并不一定是整数倍的像素。如果移动非常非常小。例如一个1x2的块,它之前在AC的位置,现在它应该在AB 和 CD之间。此时运动矢量就不再是整数级别的了。而是子像素级别(subpixel level)。

为了支持这样子像素级别的移动,我们需要进行插值。例如H.264的这个1/4像素级别,就会在两个像素间创造3个子像素(分别对应1/4像素,2/4像素,3/4像素的位置),如上图GHMN和它中间的一堆子像素(上图中的每个像素点间都可以通过插值算法补全子像素)。在比较像素块时,可以使用子像素进行比较,这样就能得到亚像素级别的移动矢量。

那么,如何进行插值呢?

再次看到这张图:

  1. 如果我们要计算GH之间中间的b的子像素值,则使用这个公式:

    前面的系数是权重。在得到$b_1$后,就可以计算b:$b=(b_1+16)>>5$,其中>>表示二级制的移位运算符。向右移5位等效于/32,这样可以将系数归一化处理。

  2. 同理,对于纵向的像素,例如计算G和M中间h的像素值,则是:

    这个地方+16,相当于加上半个分母,这样在进行整数截断的时候就可以实现四舍五入。

  3. 有了两个像素间的中间值,就可以进一步计算四个像素的中间值,例如GHMN中间的j:

    这个地方+512,相当于加上半个分母,这样在进行整数截断的时候就可以实现四舍五入。

  4. 对于1/4和3/4像素,例如下图的a和e,使用相邻像素的均值求得:

    若左右有像素时,则使用左右的像素值计算,例如:

    若左右无像素时,则使用对角的像素值计算,例如:

image-20260331163904507

小练习:假设以下像素值:A=50, B=60, C=70, D=80, E=10, F=20, G=30, H=40, I=50, J=60, K=70, L=80, M=90, N=100, P=120, Q=130, R=10, S=20, T=30, U=40,计算b,h,a,e的插值。(像素值从0-255)

image-20260331163904507

H.264:GOP的附加选项

H.264的GOP(图像组)的两种重要配置,直接影响编码性能、延迟和适用场景。

  1. 无 B 帧模式(No B-frames)

    • B 帧预测会带来额外解码延迟与存储开销,这个模式只保留I 帧 + P 帧。
    • 压缩效率相对更低,但计算简单、延迟极低。
    • 典型应用:视频会议等实时通信场景。
    • 标准兼容:H.264 基本档次(Baseline Profile)/ 约束基本档次。
  2. 多参考帧(Multiple reference frames)

    • P 帧宏块运动估计时,可从最多 N 帧历史图像找最佳匹配。
    • 优势:显著提升压缩效率,复杂运动场景更明显。
    • 代价:计算量大幅增加,编码器更复杂。

image-20260331174158139

H.264:整数变换

传统 DCT 是浮点运算,变换与反变换的舍入误差会不断累积,导致预测漂移、重建图像质量下降。H.264 用整数变换彻底解决这个问题,同时配合非线性步长量化,实现精准码率控制。

首先,二维DCT可以通过连续两次的一维DCT变换实现。假设$\mathbf f$是一个4x4的输入矩阵,F是DCT变换后的数据:

而4x4的DCT变换矩阵$\mathbf{T}$是:

其中:$a=1 / 2,\quad b=\sqrt{\frac{1}{2}} cos \frac{\pi}{8},\quad c =\sqrt{\frac{1}{2}} cos \frac{3 \pi}{8}$

要把他转换成整数变换,只需要将这个矩阵整体放缩之后,转换成近似的整数:

其中$\alpha$为缩放因子。在这个例子中,令$\alpha=2.5$,四舍五入可以得到:

这被称为整数变换的transform matrix。它的特点是:

  • H 保持正交性,但各行范数不同
  • 归一化步骤移到量化阶段,简化计算。
  • 逆变换矩阵$ \mathbf{H_{inv}} $同样是整数 / 半整数结构,无浮点误差。

H.264:量化与缩放

前向整数变换 + 量化的公式是:

其中,$\left(\mathbf{H} × \mathbf{f} × \mathbf{H}^{T}\right)$是输入矩阵$\mathbf f$整数变换的结果。$\mathbf{M_{f}}$是量化矩阵(它由$\mathbf m$推导而来),在下面会介绍它的工作原理。

量化参数(Quantization Parameter QP)可以决定压缩多大与图像的质量:

  • QP 越大 → 量化越粗糙 → 丢的数据越多 → 压缩率越高
  • QP 越小 → 量化越精细 → 保留细节 → 压缩率越低

m 矩阵是 H.264 里的「量化系数基础表」它是固定的、写死的标准数值,专门用来生成真正参与计算的 Mf 量化矩阵

如果$0\leq QP \leq 6$,则:

image-20260331195513050

例如,当QP=1时,$M_f{(0,0)}=13107$。

当$Q P ≥6$时,$m(Q P \% 6, k) / 2^{\lfloor Q P / 6\rfloor}$ 。例如Q=7时,$7\%6=1$,$2^{7/6}=2$,则$M_f$的值就是$Q=1$时的值除以2。

$m(QP,x)$的$x$表示的是位置编号,他们在m中分别是三列不同的值。

H.264:整数逆变换

对于已经变换和量化了的矩阵$\mathbf{\hat F}$,其逆变换公式是:

其中,$\mathbf{ V_{i}}$是解量化矩阵,和$M_f$类似,它也由解量化系数基础表v确定:

对于$0 \leq Q P<6$

image-20260331202726468

当$Q P ≥6$时,$v(Q P \% 6, k) / 2^{\lfloor Q P / 6\rfloor}$ 。

H.264:整数变换例题

较大量化系数QP=30:

对于数据矩阵$f$:

若量化矩阵为:

则其整数变换结果是:

注意下式是点乘!

四舍五入后是:

将其逆变换,解量化矩阵为:

逆变换结果为:

误差矩阵是:

中等量化系数QP=6

image-20260331212248190

最小量化系数QP=0

image-20260331212309831

可以看到,QP会直接影响量化造成的精度损失。

H.264:帧内编码(Intra Coding)

在 MPEG1 和 MPEG2 标准中,给定一个特定的 I 帧,我们将其划分为许多宏块。然后对于每个宏块,我们都独立地对其进行编码,不使用周围的像素来预测当前的宏块。

然而对于 h264,帧内编码的宏块是使用邻近的像素编码得到的。

它的工作原理是这样:

  • 如果你取一帧,观察相邻像素的值,很可能当前的 4x4 像素块其值与周围像素的值非常相似
  • 如果当前的 4x4,其像素块的值与周围的值非常相似,就利用周围的像素值进行差分编码。残差值会更容易压缩。

根据所选取的预测像素的方向,其被分为8个mode:

image-20260331213738645

下图是更详细的解释mode表。例如mode0就是选取A像素的值来预测第一列(4个像素),B预测第二列,CD分别预测3 4列。mode2是DC,指用ABCD IJKL的平均值来预测

image-20260331213615505

举个例子:假设一种简化的 H.264 $4 \times 4$ 帧内编码,仅使用以下三种模式:

  • 模式 0 (Mode 0):垂直预测 (Vertical)
  • 模式 1 (Mode 1):水平预测 (Horizontal)
  • 模式 2 (Mode 2):直流预测 (DC)

下图是一个由黑色方框标出的 $4 \times 4$ 亮度像素块,以及其相邻的像素值

image-20260331214806582

(a) 分别求出模式 0、模式 1 和模式 2 的 预测误差 (Prediction Errors)。

(b) 计算各模式预测误差的 绝对误差之和 (SAE, Sum of Absolute Errors)。并根据 SAE 准则,写出该 $4 \times 4$ 像素块对应的 最小预测误差矩阵 $E(i, j)$。

$SAE_0$ (Mode 0):$|0|\times 12 + |-10|\times 4 = 0 + 40 = \mathbf{40}$

$SAE_1$ (Mode 1):$|0|\times 8 + |20|\times 4 + |10|\times 4 = 80 + 40 = \mathbf{120}$

$SAE_2$ (Mode 2):$|-5|\times 8 + |15|\times 4 + |5|\times 4 = 40 + 60 + 20 = \mathbf{120}$

因此mode0的预测误差最小。

(c) 将最小预测误差 $E(i, j)$ 进行整数变换,所使用的变换矩阵为:

求最小预测误差 $E(i, j)$ 的整数变换结果

H.264:环路去块滤波(In-Loop Deblocking Filtering)

分块压缩把画面切成小方块分别处理会带来一个明显问题:块效应(Blocking Artifacts)—— 画面边缘出现生硬的格子、断层,影响观看体验。例如下面这个图,$p_3-p_0$和$q_0-q_3$分别来自于两个块,他们中间$p_0$到$q_0$出现了一个明显的断层。

image-20260331221213799

H.264就应用了环路去块滤波,专门消除块编码带来的块效应,提升主观画质,而且是在编码环路内部处理,不额外增加解码负担。

实现方式:对4×4 块的边缘像素上应用一个自适应滤波器。例如4点滤波:取$p_1,p_0,q_0,q_1$的加权平均值,生成新的$q_0$和$p_0$。

滤波器的滤波长度、强度、类型(去块 / 平滑)可自适应调整,去块同时不模糊画面细节。

H.264的其他特征

熵编码:

  • 对于 H.261,对于之前的可变长度编码,只有一组哈夫曼编码。但对于 H.264,实际上有几组不同的可能的可变长度编码或哈夫曼编码。根据具体情况或上下文决定使用哪一组可变长度编码或哈夫曼编码。这被称为上下文自适应可变长编码(Content-Adaptative Variable Length Coding CAVLC)
  • 除此之外,H.264还支持另一种自适应上下文的熵编码,上下文自适应二进制算术编码(Content-Adaptative Binary Arithmetic Coding CABAC)。这种熵编码不在本课的内容之内。

比特流

序列→视频→GOP(图像组)→帧→片(Slice)→宏块→Y/CbCr 8×8 块

image-20260331222516227

档次(Profile)

H.264 设计了 4 个档次,适配不同设备:

  1. Baseline:移动端、低功耗
  2. Extended:扩展应用
  3. Main:标清 / 高清广播
  4. High:高清 / 超高清高质量场景

image-20260331222636383

SVC 可伸缩视频编码

支持时域、空域、质量可伸缩,适配不同带宽网络,一套码流适配多种设备。

MVC 多视点视频编码

支持多摄像头画面压缩,用于自由视点视频(Free Viewpoint Video FVV),用户可切换观看角度。

H.265 & H.266

H.265

H.265 2013 年标准化,为超高清时代设计:

  1. 相比 H.264 的升级

    • 支持到 8K、120fps
    • 更先进的插值和去块滤波:8×8 块(H.264 是 4×4)
    • 支持并行处理,解码更快
    • 同画质下码率更低
  2. 核心特性

    • 宏块结构被替换为不同层级和尺寸下的编码块的四叉树编结构

    • 帧内预测增加到了33 种角度(H.264 更少)

      image-20260331223534955

    • 改进了四分之一像素插值算法

H.266

H.266 是多功能视频编码,面向未来超高清与沉浸式场景:

  • 支持 16K、HDR、360° 全景、YCbCr 4:4:4/4:2:2/4:2:0
  • 10~16bit 色深
  • 同画质下,比 H.265 再省 50% 码率