【音视频】H264中的SPS和PPS
SPS(序列参数集)和PPS(图像参数集)是H.264视频码流中的两种关键参数集,它们不包含图像数据本身,而是承载了解码器如何正确解码视频所必需的“说明书”或“配置信息”。
为了快速把握全貌,下表对比了它们的核心职责与特点。
| 特性 | SPS(序列参数集) | PPS(图像参数集) |
|---|---|---|
| 核心作用 | 定义整个视频序列的全局性参数 | 定义解码单帧或一组帧时所需的图像级参数 |
| 影响范围 | 整个视频序列(如一个视频文件或一段连续的直播流) | 单帧或一组图像 |
| 类比 | 一部电影的总体规格(如总分辨率、色彩标准) | 电影中单个场景的拍摄参数(如本场景的布光、滤镜) |
| NALU类型码 | 7 | 8 |
| 稳定性 | 通常在一个序列中保持不变 | 可能在不同图像间发生变化 |
📜 SPS:视频的“身份证”
SPS包含了描述视频整体特性的全局参数,解码器依靠它来建立正确的解码环境。
关键参数与意义:
- Profile & Level(档次与级别):
profile_idc和level_idc是SPS中最重要的标识符之一。- Profile(档次):定义了编码器使用的一套工具算法集,直接影响兼容性和压缩效率。例如,
66代表 Baseline Profile,兼容性最好,适用于视频会议等实时性要求高的场景;77代表 Main Profile,支持更高效的压缩技术(如B帧和CABAC),常用于广播电视和视频点播;100代表 High Profile,提供最高的压缩效率和视频质量,用于高清电视和蓝光光盘。 - Level(级别):规定了在特定Profile下,解码器需要满足的性能要求,如支持的最大分辨率、帧率和码率等。
- Profile(档次):定义了编码器使用的一套工具算法集,直接影响兼容性和压缩效率。例如,
- 分辨率与帧率:SPS中通过宏块数量等参数间接定义了视频的图像尺寸(如1920x1080)和帧率信息。这些参数确保了视频能以正确的比例和流畅度播放。
- 其他关键信息:还包括色度格式(如4:2:0)、参考帧的最大数量、图像编码方式(帧编码或场编码)等。
🎨 PPS:解码单帧的“操作指南”
PPS则包含了解码具体图像时所需的参数。一个SPS可以被多个PPS引用,从而在不同场景下应用不同的解码策略。
关键参数与意义:
- 熵编码模式:
entropy_coding_mode_flag是一个关键开关。当该值为0时,使用CAVLC,算法简单,适用于基线档次;当该值为1时,使用CABAC,压缩效率更高但计算更复杂,主要用于主档次和高级档次。 - 量化参数:
pic_init_qp_minus26用于设定初始的量化参数。量化是压缩过程中影响图像质量和文件大小的关键步骤,QP值越大,压缩率越高,但画质损失也可能越大。 - 去块滤波控制:
deblocking_filter_control_present_flag指示是否启用去块滤波器。该滤波器可以有效减轻因块编码可能产生的边缘方块效应,提升主观画质。
🤝 协同工作流程
SPS和PPS通过严格的引用关系协同工作,确保视频能被正确解码:
- 层级引用:一个PPS中通过
seq_parameter_set_id字段指明它从属于哪个SPS。而一个图像片(Slice)的头部又通过pic_parameter_set_id字段指明它使用哪个PPS。这样就建立了 Slice -> PPS -> SPS 的清晰层级链。 - 码流中的位置:在H.264码流中,SPS和PPS通常位于所有图像帧之前发送。一个典型的开头序列是:SPS → PPS → 关键帧(IDR帧)。这样确保了解码器在收到实际图像数据前,已经获得了所有必要的“说明书”。在直播等流媒体场景中,它们也可能被周期性地重复发送,以便新加入的接收者能够正常解码。
- 重要性:如果SPS或PPS丢失或损坏,解码器将无法正确解析后续的视频数据,导致无法解码、花屏或解码错误。
💎 总结
总而言之,SPS为整个视频序列定下了基调与框架,是视频的“根本大法”;而PPS则在这个框架内规定了解码每一帧的具体方法,是“实施细则”。它们分离了全局稳定参数和局部可变参数,既减少了码流冗余,又为H.264的灵活性与高压缩效率做出了重要贡献。
