H264: SPS和PPS概念
1. 基本概念
1.1 SPS (Sequence Parameter Set) - 序列参数集
- 作用: 定义整个视频序列的全局参数
- 包含信息: 视频分辨率、帧率、编码配置、参考帧数量、色彩空间信息
- 特点: 在整个视频序列中保持不变
1.2 PPS (Picture Parameter Set) - 图像参数集
- 作用: 定义图像解码所需的参数
- 包含信息: 熵编码类型、分片组信息、去块滤波器参数、量化参数
- 特点: 可能在不同图像间变化
2. 在H.264编码中的作用
- 解码器初始化: SPS和PPS必须在解码第一帧之前被解析
- 帧间依赖关系: I帧包含完整参数,P/B帧依赖之前帧的参数
- 错误恢复: 帮助解码器在传输错误后重新同步
3. MP4格式中的SPS/PPS
- 存储位置:
extradata
字段中的AVCDecoderConfigurationRecord结构 - 特点: 集中存储,便于管理,但extradata丢失会导致整个视频无法解码
- 数据流: 视频帧本身不包含SPS/PPS,解码器从容器头部获取
4. TS格式中的SPS/PPS
- 存储位置: 每个关键帧前的NALU流中
- 特点: 分散存储,容错性强,但数据冗余
- 数据流: 每个关键帧前都有SPS/PPS,支持随机访问
5. AVCC转流媒体格式
5.1 主要转换内容
- 从MP4的extradata中提取SPS/PPS参数
- 将AVCC格式(长度前缀)转换为Annex-B格式(起始码)
- 在关键帧前插入必要的SPS/PPS信息
- 确保流媒体传输的容错性和随机访问能力
6. 常见问题
- "non-existing PPS 0 referenced"错误: 解码器找不到PPS信息
- 解码失败: SPS/PPS信息不完整或损坏
- 文件体积过大: 过度插入SPS/PPS
7. 最佳实践
- 在视频开始前确保SPS/PPS可用
- 在关键帧前检查是否需要插入
- 优先从extradata提取SPS/PPS
- 使用Annex-B格式作为输出
8. 📚 总结
SPS和PPS是H.264编码的核心参数,在不同容器格式中的存储方式影响解码的可靠性和效率:
- MP4格式: 集中存储,管理方便但容错性差
- TS格式: 分散存储,容错性强但数据冗余
- 格式转换: 需要智能地提取和插入SPS/PPS,确保兼容性