1. H.264/AVC 编码标准概述:发展历史、技术特点、应用场景与行业地位

各位好,咱们开始第一讲。H.264,也叫 AVC(Advanced Video Coding),这玩意儿在视频编码领域,说它是「一代宗师」一点不过分。我入行那会儿,正好赶上它从 MPEG-2 往 H.264 过渡的尾巴,那时候就觉得,这标准真能打,一打就是二十年。

说白了,H.264 就是一套把视频压得更小、画质还更好的方法。它解决了之前标准里很多「看着还行,一放大就糊」的问题。今天咱们就把它从里到外捋一遍。

1.1 发展历史:从 VCEG 到联合战队

H.264 的诞生,其实是个「强强联合」的故事。

  • 1998 年:ITU-T 的视频编码专家组(VCEG)开始搞一个叫 H.26L 的项目,目标是比 H.263 效率翻倍。
  • 2001 年:ISO/IEC 的 MPEG 觉得这项目有前途,两家一合计,组成了联合视频组(JVT)。
  • 2003 年 3 月:正式发布第一版。我记得当时文档刚出来,我们团队连夜啃,发现里面多了好多以前没见过的概念。
  • 后续版本:2004 年加 Fidelity Range Extensions(FRExt),2005 年加 Scalable Video Coding(SVC),2007 年加 Multiview Video Coding(MVC)。

关键节点:H.264 是第一个同时被 ITU-T 和 ISO/IEC 采纳的「双料」视频编码标准。它的官方名字叫 H.264(ITU-T 侧)和 MPEG-4 Part 10 / AVC(ISO/IEC 侧)。

为什么会搞这么久?因为当时 DVD 刚普及,网络视频开始冒头,大家发现 MPEG-2 那套已经不够用了。H.264 的目标很明确:在同等画质下,码率比 MPEG-2 降低 50% 以上。

1.2 技术特点:H.264 到底牛在哪?

H.264 不是凭空造出来的,它继承了 H.263 和 MPEG-4 Visual 的很多思路,但做了几个关键改进。我挑几个最核心的说说。

1.2.1 帧内预测:从「直接编码」到「猜像素」

以前的编码标准,帧内编码就是直接对像素做 DCT 变换。H.264 不一样,它先根据周围已经编好的像素,猜当前块的内容,然后只编码「猜错了多少」。你想想看,如果猜得准,残差就很小,码率自然就下来了。

  • 4×4 亮度块:支持 9 种预测模式(方向预测)。
  • 16×16 亮度块:支持 4 种预测模式(平面、垂直、水平、DC)。
  • 8×8 色度块:支持 4 种预测模式。

我的经验:在画面纹理复杂的场景(比如树叶、草地),4×4 模式比 16×16 模式能省 10%-15% 的码率。但代价是编码时间翻倍。我在做实时编码器时,一般会设一个阈值,平坦区域用大块,复杂区域用小块。

1.2.2 运动补偿:更精细的块划分

H.264 的运动补偿,说白了就是把画面切得更碎,然后分别找参考。

  • 宏块划分:16×16 可以拆成 16×8、8×16、8×8。
  • 亚宏块:8×8 还能继续拆成 8×4、4×8、4×4。
  • 亚像素精度:支持 1/4 像素亮度插值和 1/8 像素色度插值。

我记得有一次做监控视频编码,画面里有个行人慢慢走过。如果用 16×16 整块做运动估计,残差很大;换成 4×4 小块后,每个小块的运动矢量更准,码率直接降了 30%。

1.2.3 整数 DCT 变换:告别浮点误差

以前的 DCT 变换用浮点数,不同解码器算出来的结果可能不一样,导致「漂移」。H.264 改用 4×4 整数 DCT,所有计算都是整数运算,结果唯一。

// H.264 4x4 整数 DCT 变换矩阵(未缩放)
// 核心思想:用整数近似浮点 DCT,再通过后处理补偿缩放
// 正向变换:
// Y = Cf * X * Cf^T
// 其中 Cf = 
// [1,  1,  1,  1]
// [2,  1, -1, -2]
// [1, -1, -1,  1]
// [1, -2,  2, -1]

注意:整数 DCT 虽然避免了漂移,但变换后的系数需要做缩放补偿。这个缩放是在量化阶段一起做的,所以编码器里「变换 + 量化」通常是一起实现的,不要分开优化。

1.2.4 环路去块滤波:消除「马赛克」

块效应是块编码的通病。H.264 在编码环路里加了一个去块滤波器,边编码边滤波。这招很聪明——滤波后的图像作为后续帧的参考,能防止块效应扩散。

  • 滤波强度:根据量化参数、运动矢量差异、残差大小动态调整。
  • 边界判断:只在宏块边界和子块边界做滤波。

我曾经遇到一个坑:在低码率下(QP 很大),去块滤波如果开得太强,画面会变得「糊」;如果开得太弱,块效应又很明显。后来我根据 QP 值做了一个分段函数,QP 越大滤波强度越大,效果好了很多。

1.2.5 熵编码:CAVLC 与 CABAC

H.264 提供了两种熵编码方式:

特性 CAVLC CABAC
全称 Context-Adaptive Variable Length Coding Context-Adaptive Binary Arithmetic Coding
复杂度 低 高
压缩率 基准 比 CAVLC 高 10%-15%
适用场景 低功耗、实时编码 高压缩率、离线编码

我的建议:如果做移动端编码器,用 CAVLC 就够了,省电。如果是做视频点播的离线转码,上 CABAC,那 10% 的码率节省在带宽成本上很可观。

1.3 应用场景:无处不在的 H.264

H.264 的应用范围,我估计比在座各位想象的还要广。它几乎覆盖了所有需要视频压缩的领域。

  • 视频通话:Skype、Zoom、视频,底层基本都是 H.264。
  • 流媒体:YouTube、Netflix、Bilibili,H.264 是兼容性最好的编码。
  • 广播电视:DVB、ATSC、ISDB 都支持 H.264。
  • 蓝光光盘:Blu-ray 强制支持 H.264 编码。
  • 监控安防:H.264 是 IP 摄像头的标配。
  • 视频编辑:很多专业非编软件用 H.264 做代理码流。

说白了,只要是个能播视频的设备,十有八九都支持 H.264 硬解码。这个生态优势,后来者很难撼动。

1.4 行业地位:为什么它还是「老大哥」?

虽然 H.265/HEVC 和 AV1 已经出来好几年了,但 H.264 在行业里的地位依然很稳。我总结了几点原因:

  1. 兼容性无敌:从 2005 年的诺基亚 N 系列到 2024 年的 iPhone,所有设备都支持 H.264 硬解。
  2. 专利池成熟:虽然也有专利费,但授权模式清晰,不像 HEVC 那样专利大战打了好几年。
  3. 编码器优化充分:x264 这个开源编码器,经过十几年打磨,在同等码率下,画质比很多商业 HEVC 编码器还稳。
  4. 生态完善:封装格式(MP4、TS)、流媒体协议(HLS、DASH)、播放器(VLC、FFmpeg),全链路支持。

一句话总结:H.264 是视频编码领域的「普通话」,人人都懂,哪儿都能用。新标准再好,也得先跟它比一比。

1.5 知识体系框架:一张图看懂 H.264

下面这张图,我把 H.264 的核心技术模块和它们之间的关系画出来了。你把它存下来,后面讲到具体模块时,随时回来对照。

H.264/AVC 核心技术体系 原始视频帧 帧内预测 (Intra Prediction) 帧间预测 (Inter Prediction) 残差 (Residual) 整数 DCT 变换 + 量化 熵编码 (CAVLC / CABAC) H.264 码流 环路去块滤波 帧内/帧间预测 → 残差 → 变换量化 → 熵编码

嗯,这张图把 H.264 的编码流程串起来了。你从「原始视频帧」开始,顺着箭头走一遍,就能理解一帧画面是怎么被压缩成码流的。后面几章,咱们会逐个模块深入拆解。