H.264(Advanced Video Coding,也称 AVC)是一种应用极广的视频编码标准,通过帧内/帧间预测、变换量化、熵编码和环路滤波,把原始视频压缩成适合存储和传输的码流。
它比早期 MPEG-2 等标准压缩效率更高,又比 H.265(HEVC) 更容易被老设备、浏览器、相机、播放器和硬件解码器支持。
核心问题
视频里有大量空间和时间冗余:同一帧内邻近像素相似,相邻帧之间也常常只有局部移动。H.264 的目标是把“可以预测出来的部分”尽量不直接存,只保存预测方式和预测误差。
核心对象
| 对象 | 作用 | 工程关注点 |
|---|---|---|
| macroblock | H.264 的核心处理块,通常以 16x16 亮度区域为基础 | 解码、滤波、运动补偿的基本组织单位 |
| slice | 一帧中的可独立解析区域 | 错误恢复、并行和封包边界 |
| I/P/B frame | 帧类型 | 影响压缩率、延迟和随机访问 |
| reference frame | 被后续帧引用的已解码帧 | 影响内存占用和运动补偿 |
| motion vector | 指向参考帧中相似块的位移 | 用于帧间预测 |
| residual coefficient | 预测误差经过变换和量化后的系数 | 决定细节保留和码率 |
| profile / level | 功能集合和能力上限 | 影响硬件兼容、分辨率、码率和工具集 |
核心机制
H.264 解码的核心路径是:
- 解析码流中的 SPS/PPS、slice header、宏块类型和预测信息。
- 对语法元素做熵解码,常见方式包括 CAVLC 或 CABAC。
- 根据帧内或帧间预测模式生成预测块。
- 对残差系数做反量化和反整数变换。
- 把预测块和残差块相加,得到重建块。
- 做 deblocking filter,减轻块边界伪影。
- 输出当前帧,并把需要引用的帧放入参考帧缓冲。
简化公式是:
decoded_block = predicted_block + reconstructed_residualpredicted_block是由邻近像素或参考帧生成的预测结果。reconstructed_residual是压缩码流里保存的预测误差,经过熵解码、反量化、反变换后得到。- 解码器不需要知道原始未压缩块,只按码流中保存的预测指令和残差信息重建近似图像。
工程用途
- 浏览器视频、直播、视频会议和移动端播放。
- 相机、采集卡、UVC 设备和嵌入式录像。
- 需要广泛兼容旧设备或低性能设备的视频分发。
- 对实时性、低延迟和稳定硬解支持要求更高的场景。
与 H.265 的边界
H.264 和 H.265 都属于有损视频编码标准,都使用预测、残差、变换、量化和熵编码。但工程取舍不同:
| 维度 | H.264 | H.265 |
|---|---|---|
| 压缩效率 | 较高,长期够用 | 通常更高 |
| 软解码成本 | 通常较低 | 通常较高 |
| 硬件兼容性 | 非常广 | 新设备较好,老设备不稳定 |
| 常见用途 | 直播、视频会议、兼容分发 | 4K/8K、存储节省、高码率内容 |
| 延迟调优 | 成熟工具链多 | 需要更仔细检查硬解和播放器路径 |
常见坑
- 把 H.264 当成 MP4:MP4 是容器,H.264 是视频轨的编码格式。
- 只看码率不看画质和延迟:低码率可能来自更强压缩,也可能来自细节损失、降噪或更长 GOP。
- 误判硬解路径:播放器显示能播放,不代表走了硬件解码;可能已经回退到软解码。
- 忽略 profile/level:Baseline、Main、High 等 profile 的工具集不同,硬件支持也不同。