H.264

H.264(又名 AVC、MPEG-4 Part 10)是目前应用最广的视频压缩标准。核心思路是去除视频中的冗余信息(空间、时间、编码、视觉冗余)。

核心原理(分点答)

1. 帧类型与 GOP

  • I 帧:关键帧,只做帧内预测,可独立解码,体积大
  • P 帧:前向预测,参考前面的帧
  • B 帧:双向预测,参考前后帧,压缩率最高,但有延迟
  • GOP:两个 I 帧之间的序列;GOP 越长压缩率越高,但随机访问和容错越差
  • IDR 帧:特殊的 I 帧,解码器遇到后会清空参考帧缓存,是真正的随机访问点

2. 宏块(Macroblock,MB)

  • 定义:每一帧图像被划分成若干 16×16 像素的宏块,是编码的基本处理单位,预测、变换、量化、熵编码都以块为单位
  • 组成(4:2:0 采样):亮度 Y 16×16 + 色度 Cb 8×8 + 色度 Cr 8×8
  • 层级关系:
1
2
3
4
图像(Frame)
└── Slice(一个或多个)
└── 宏块 MB(16×16)
└── 子块(预测分区 / 变换块)
  • Slice(条带):若干宏块按扫描顺序组成一个 Slice,是 NALU 承载的数据单元,也是可独立解码的最小单元,有利于容错和并行
  • 宏块类型:
    • I 宏块:只用帧内预测
    • P 宏块:参考前面的帧
    • B 宏块:参考前后帧
    • Skip 宏块:不传残差和运动矢量,解码端直接用预测值,几乎不占码率,静止背景里很常见
  • 宏块划分:
    • 帧内:Intra 16×16(整块,适合平坦区域)、Intra 4×4(拆成 16 个小块,适合细节多的区域)、Intra 8×8(High Profile)
    • 帧间:16×16、16×8、8×16、8×8,8×8 还可再分 8×4、4×8、4×4,每个分区有各自的运动矢量
  • 注意:宏块只是处理单位,帧内和帧间都以宏块为单位。P/B 帧里的宏块可以逐块选择帧内还是帧间模式(比如新出现的物体找不到参考块时用帧内),由编码器按码率和失真的代价决定,宏块类型和帧类型不是一回事

3. 帧内预测(去空间冗余)

  • 利用相邻像素相关性,用同一帧内已编码的邻近块预测当前块
  • 亮度有三种尺寸:Intra 4×4(9 种方向模式)、Intra 8×8(High Profile,9 种模式)、Intra 16×16(4 种模式)

4. 帧间预测(去时间冗余)

  • 运动估计 + 运动补偿:在参考帧中找最相似的块(运动估计,得到运动矢量),用运动矢量取出预测块(运动补偿),只存运动矢量 + 残差
  • 支持宏块可变分块(16×16 到 4×4)
  • 多参考帧、1/4 像素精度运动矢量

5. 变换与量化

  • 对残差做整数 DCT(4×4 / 8×8),避免浮点误差,计算简单
  • 量化是有损的主要环节,QP 越大,压缩率越高,画质越差

6. 熵编码

  • CAVLC:基于上下文的变长编码,复杂度低
  • CABAC:基于上下文的算术编码,效率更高(省约 10%~15% 码率),复杂度高,Main/High Profile 支持

7. 环路滤波(Deblocking Filter)

  • 消除宏块边界的块效应,滤波后的帧作为参考帧,提升预测质量

码流结构(面试高频)

  • NALU(网络抽象层单元):基本传输单元,由 NAL 头(1 字节)+ 载荷组成
  • 起始码:00 00 00 01 或 00 00 01(Annex B 格式)
  • NAL 类型常见:
    • 7 SPS(序列参数集)
    • 8 PPS(图像参数集)
    • 5 IDR 帧
    • 1 非 IDR 帧(P/B)
    • 6 SEI
  • VCL / NAL 分层:VCL 负责编码,NAL 负责打包适配网络
  • 两种封装格式:
    • Annex B:起始码分隔,用于 TS、RTP 流
    • AVCC:长度前缀,用于 MP4、FLV,SPS/PPS 放在 extradata 里

Profile 与 Level

  • Baseline:无 B 帧、无 CABAC,低延迟,用于视频通话
  • Main:支持 B 帧、CABAC,用于标清广播
  • High:8×8 变换等,用于高清、蓝光、主流点播直播
  • Level:限制分辨率、帧率、码率上限(如 4.0 对应 1080p30)

码率控制

  • CBR:恒定码率,适合直播
  • VBR:可变码率,画质更均匀,适合点播
  • CRF(x264):恒定质量,最常用
  • ABR / CQP

优缺点与对比

  • 优点:兼容性极好(软硬解全覆盖)、压缩率高、生态成熟
  • 缺点:相比 H.265 / AV1 压缩率偏低;有专利费
  • 对比:H.265 同画质省约 50% 码率但编码复杂、授权复杂;AV1 开源免费但编码慢
  • 块结构对比:H.264 是固定 16×16 宏块再分区;H.265 是最大 64×64 的 CTU 四叉树递归划分(CU/PU/TU),高分辨率下更高效

实际经验

  • 用 FFmpeg / x264 编码:ffmpeg -i in.mp4 -c:v libx264 -crf 23 -preset medium out.mp4
  • 直播里关键帧间隔通常设 1~2 秒,便于秒开和切换
  • 低延迟场景去掉 B 帧,用 -tune zerolatency
  • 花屏 / 卡顿排查:看是否丢了 SPS/PPS 或 IDR 帧

回答模板(30 秒精简版)

H.264 是一种主流的视频压缩标准。它把每帧图像划分成 16×16 的宏块作为基本编码单位,若干宏块组成 Slice。然后通过帧内预测去除空间冗余,通过帧间预测(运动估计与补偿)去除时间冗余,再对残差做整数 DCT 变换和量化,最后用 CAVLC/CABAC 熵编码,并加上去块滤波提升画质。码流由 NALU 组成,包含 SPS、PPS、IDR 等;帧分为 I、P、B 三种,由 GOP 组织。按场景不同有 Baseline、Main、High 等 Profile。相比 H.265 压缩率稍低,但兼容性最好,所以目前仍是最广泛使用的编码。

面试常见追问

  1. IDR 和 I 帧区别?→ IDR 会清空参考帧缓存,之后的帧不能越过它参考
  2. SPS/PPS 作用?→ 存解码所需的全局参数(分辨率、profile、熵编码方式等),丢了无法解码
  3. 为什么有 B 帧会有延迟?→ 解码顺序与显示顺序不一致,需要缓存后续帧(DTS ≠ PTS)
  4. 花屏、马赛克怎么来的?→ 丢包导致参考帧错误,误差累积,直到下一个 IDR 才恢复
  5. 宏块是什么?→ 16×16 的基本编码单位,帧内帧间都以它为单位;P/B 帧里的宏块可逐块选帧内或帧间模式
  6. 宏块和 Slice 的关系?→ 多个宏块组成一个 Slice,Slice 是 NALU 承载的单元,可独立解码

H.265 / AV1 的改进

  • H.265(HEVC):H.264 的继任者,同画质省约 50% 码率,但授权复杂
  • AV1:开源免费,压缩率比 H.265 再好约 20%~30%,但编码慢、硬件支持仍在普及
H.264 H.265 AV1
发布 2003 2013 2018
制定方 ITU-T + ISO ITU-T + ISO AOMedia 联盟
授权 有专利费 专利池多(MPEG LA、HEVC Advance、Velos 等),费用复杂 免专利费(开源)
压缩效率 基准 比 H.264 省约 40%~50% 比 H.264 省约 50%60%,比 H.265 再省约 20%30%
编码复杂度 低 高(约 H.264 的 2~10 倍) 极高(软编很慢,需硬件编码器)
解码复杂度 低 中 中高
兼容性 几乎所有设备 主流设备,浏览器支持较差 新设备和主流浏览器支持,老设备需软解

H.265 相对 H.264 的核心改进

1. 块结构:宏块 → CTU

  • H.264:最大 16×16 宏块
  • H.265:CTU 最大 64×64,用四叉树递归划分成 CU / PU / TU
  • 大块适合高分辨率平坦区域,压缩效率显著提升,对 4K/8K 尤其明显

2. 帧内预测

  • H.264:最多 9 种方向模式
  • H.265:35 种模式(33 种方向 + DC + Planar),预测更精细

3. 帧间预测

  • 更灵活的 PU 划分(含非对称划分)
  • 运动矢量预测引入 Merge / AMVP 模式,减少 MV 开销

4. 变换

  • 支持 4×4 到 32×32 的整数变换(H.264 只有 4×4 / 8×8)

5. 环路滤波

  • 在去块滤波基础上新增 SAO(样本自适应偏移),进一步减少振铃效应

6. 熵编码

  • 只保留 CABAC(去掉 CAVLC),并优化了并行性

7. 并行化

  • 新增 Tile、WPP(波前并行),更适合多核编解码

8. 码流结构

  • 仍是 NALU,但 NAL 头 2 字节,新增 VPS(视频参数集)
    1
    2
    3
    4
    VPS(整个视频,跨层/跨序列)
    └── SPS(一个编码视频序列:分辨率、profile、帧率、参考帧数等)
    └── PPS(单张或多张图像:熵编码模式、量化参数初值、tile 划分等)
    └── Slice(具体的条带数据)
  • 常见类型:32 VPS、33 SPS、34 PPS、19/20 IDR

AV1 相对 H.265 的核心改进

1. 块结构更灵活

  • 最大 128×128 超级块,支持更多划分方式(含 T 形、4 路划分等)

2. 更丰富的预测工具

  • 帧内:56 种方向模式,另有 CfL(色度预测亮度)、调色板模式、帧内块拷贝(利于屏幕内容)
  • 帧间:复合预测(OBMC、楔形混合等)、全局运动 / 仿射运动、Warped Motion

3. 变换

  • 更多变换类型(DCT、ADST、Identity 等组合),尺寸最大到 64×64

4. 环路滤波

  • 去块 + CDEF(约束方向增强滤波)+ 环路恢复滤波,多级组合

5. 熵编码

  • 多符号自适应算术编码,不再是二进制 CABAC

6. 其他特色

  • 胶片颗粒合成(Film Grain Synthesis):只传参数,解码端还原颗粒
  • 为 Web 设计,封装采用 OBU 而不是 NALU

选型建议

场景 推荐
要覆盖所有设备、老设备 H.264
4K/HDR,追求节省带宽,设备较新 H.265
大型点播平台、带宽成本敏感、可接受编码成本 AV1(YouTube、Netflix 已大量使用)
实时通信(WebRTC) H.264 为主,AV1 逐步应用
直播 H.264 为主,H.265 / AV1 逐步推进

面试回答模板(40 秒版)

H.265 在 H.264 的基础上做了几处关键升级:块结构从 16×16 宏块换成最大 64×64 的 CTU 四叉树,帧内预测方向从 9 种增加到 35 种,变换支持到 32×32,加入了 SAO 滤波,并行上支持 Tile 和 WPP,同画质下码率约省一半,代价是编码复杂度大幅上升,且专利授权复杂。
AV1 是 AOMedia 推出的免专利费编码,用 128×128 超级块、更多预测工具和 CDEF 等滤波,压缩率比 H.265 还能再好 20% 左右,但编码很慢,要靠硬件编码器普及。
所以现状是 H.264 保兼容、H.265 做高清和 4K、AV1 面向未来和大平台降本。

常见追问

  1. 压缩率提升的本质是什么? → 更大更灵活的块划分 + 更多预测模式 + 更强的滤波,用更高的计算复杂度换码率
  2. H.265 的 NAL 头和 H.264 有何不同? → H.264 是 1 字节,H.265 是 2 字节,且新增 VPS(整个视频的参数)