音视频相关记录总结
1.DTS和PTS在使用I P P P没有B帧的情况下,两个时间戳是一样的。如果有B帧的情况就不一样。
因为B帧需要参考前后帧,因此在B帧编码的时候,需要先编码前后帧后再编码B帧,编码顺序:I->P->B,那么解码顺序也是I->P->B,但是显示顺序是I->B->P
DTS:标记帧的解码时间(解码器按DTS顺序处理帧)。
PTS:标记帧的显示时间(播放器按PTS顺序输出帧)
2.NALU header
+---------------+ |F|NRI| Type | +---------------+ 1 2 5 (bits)
1.F (forbidden_zero_bit,1 bit)
-
必须为
0。 -
如果为
1,说明该 NAL 单元有错误或被丢弃(接收端可忽略或丢弃该 NALU)。
2.NRI(nal_ref_idc,2 bit)
表示该 NALU 的参考级别(Reference IDC)。
数值越高,重要性越高。
-
00:该 NALU 不用于参考(如 B 帧、SEI)。 -
01:低优先级参考帧。 -
10:中优先级参考帧。 -
11:最高优先级参考帧(如 I 帧的 slice)。
3.type(nal_unit_type,5 bit)
| type值 | 含义 | | --------- | ----------------------------------------------- | | 1 | 非 IDR 图像的 slice | | 5 | IDR 图像的 slice(关键帧) | | 6 | SEI (Supplemental Enhancement Information) 扩展信息 | | 7 | SPS (Sequence Parameter Set,序列参数集) | | 8 | PPS (Picture Parameter Set,图像参数集) | | 9 | AUD (Access Unit Delimiter,访问单元分隔符) | | 10-23 | 保留给扩展 | | 24-27 | 分片/聚合用(STAP-A, STAP-B, MTAP16, MTAP24) | | 28 | FU-A(分片单元,用于 RTP) | | 29 | FU-B(分片单元,用于 RTP) | | 0, 30, 31 | 保留/未定义 |
3.怎么区分I P B帧
在 H.264 中,NALU header 里的 Type 字段只能告诉你这是一个 slice(片)还是 SPS/PPS/SEI 等,但它不能直接区分 I / P / B 帧。
要区分 I、P、B 帧,需要进一步看 slice header。
NALU header → 确认是不是 slice
-
nal_unit_type = 1→ 非 IDR 图像的 slice(可能是 P、B 或非 IDR 的 I slice)。 -
nal_unit_type = 5→ IDR 图像的 slice(关键帧 I)。
slice header → 确认 slice_type
-
0 / 5→ P slice -
1 / 6→ B slice -
2 / 7→ I slice -
3 / 8→ SP slice(少用) -
4 / 9→ SI slice(少用)
4.SEI SPS PPS
1. SPS(Sequence Parameter Set,序列参数集)
-
作用:描述“视频序列”的全局参数(对一组帧都适用)。
-
包含内容:
-
profile/level(解码能力要求)
-
图像分辨率(宽/高)
-
帧率相关(时间戳、时序信息)
-
参考帧数量上限
-
POC(显示顺序控制)模式
-
-
影响范围:一个视频流里 长期不变 的参数。
-
类比:相当于一本书的“目录页”,告诉解码器:这本书有几章,纸张大小是多少。
2. PPS(Picture Parameter Set,图像参数集)
-
作用:描述“某个图像(或一组图像)”的编码参数。
-
包含内容:
-
熵编码方式(CAVLC / CABAC)
-
去块滤波参数
-
参考帧列表设置
-
slice QP 偏移量
-
-
影响范围:比 SPS 更细粒度,可以对不同帧应用不同 PPS。
-
类比:相当于“章节的具体说明”,比如某一章要用不同的纸张、不同的行距。
3. SEI(Supplemental Enhancement Information,补充增强信息)
-
作用:附加信息,不影响解码正确性,但用于增强体验或同步。
-
常见类型:
-
时间戳(PTS/DTS)
-
色彩空间信息
-
HDR 相关信息
-
用户数据(如字幕、metadata)
-
-
影响范围:可选,不解码 SEI 也能正常播放视频。
-
类比:相当于“脚注或附录”,看不看无所谓,但有时能帮你更好理解内容。
4. 三者关系
-
SPS:全局层次(视频序列级,像“环境设定”)。
-
PPS:局部层次(图像/帧级,像“局部说明”)。
-
SEI:辅助层次(附加信息,不解码也能播)。
在实际传输中:
-
解码器 必须要有 SPS 和 PPS 才能正确解码视频。
-
SEI 可有可无,用于增强(比如流媒体里常用 SEI 来携带时间戳、同步信息)。
出场顺序:
[起始部分] ↓ AUD (可选,Access Unit Delimiter,访问单元分隔符) SPS (序列参数集) PPS (图像参数集) SEI (补充信息,可选) I slice (IDR 图像 slice) P/B slice (后续帧) ... [重复] PPS (可能重复发送) SEI (可能插入) slice 数据
SPS/PPS:
初次出现:视频流开始时,必须给解码器一个“说明书”。
再次出现的情况:
关键帧(IDR)之前
-
为了提高解码器兼容性,通常在每个 IDR 帧之前,编码器会重新发一份 SPS/PPS。
-
这样即使中途加入解码,也能正确解码,不用依赖很久以前的参数。
参数发生变化时
-
例如分辨率、帧率、色彩格式、参考帧配置等发生变化 → 新的 SPS 或 PPS 必须被发送。
周期性冗余发送
-
在流媒体/弱网络场景(RTSP、RTP、HLS、DASH),有些编码器会每隔 N 秒或每个 IDR 前都重复发 SPS/PPS,避免丢包造成解码失败。
SEI:
初次出现:通常紧跟在 SPS/PPS 后,用于传递时间戳、HDR、字幕等信息。
再次出现的情况:
每个关键帧前
-
常见于传递时间戳(Picture Timing SEI)、缓冲区控制(Buffering SEI)。
有新的元信息时
-
比如 HDR 元数据更新、切换字幕轨、用户数据插入。
直播/同步场景
-
有些直播推流(RTMP、HLS)会在每一帧前都加一个 SEI(携带时间戳信息),方便播放器对齐音视频。
-
H.264 标准里没有规定 SPS、PPS、SEI 后面必须是 I 帧(IDR)。
-
它们的作用是 为解码器提供参数/附加信息,并不强制决定后面是哪种帧。
-
视频流开头(第一次出现 SPS/PPS/SEI)
-
几乎所有编码器都会安排 IDR 帧(关键帧) 紧随其后。
-
原因:解码器刚拿到参数,就必须用一个“完整自解码的帧”开始,否则没有参考帧解不出来。
-
所以在流的开头,SPS+PPS+SEI 后面一般跟着 I 帧(IDR)。
-
-
视频流中途(再次出现 SPS/PPS/SEI)
-
常见情况:在每个 IDR 帧之前重复发送 SPS/PPS(提升容错和解码同步能力),所以很多时候你会看到 SPS/PPS/SEI → I 帧。
-
特殊情况:如果只是编码参数变化(如 SEI 插入 HDR 信息、用户数据),也可能出现在 P/B 帧前,不一定非得是 I 帧。
-
-
容错/冗余插入
-
某些推流器会周期性插入 SPS/PPS,即便当前不是 IDR 帧。解码器只会更新内部参数,并不会强制重置参考。
-
所以这种情况下可能出现:
... P 帧 SPS PPS SEI P 帧 B 帧 ...
浙公网安备 33010602011771号