音视频学习(三十九):IDR帧和I帧
主要区分:
I 帧 是帧内编码帧,IDR 帧 是一种特殊的 I 帧,它是“清除参考帧链的强制切断点”。
H.264 视频结构
结构
H.264 视频由多个 NAL(Network Abstraction Layer)单元 构成,每一帧图像可由一个或多个 NAL 单元组成。
典型结构:
H.264码流 =
| SPS | PPS | IDR | P帧 | B帧 | ... |每帧 =
| Start Code | NAL Header | Payload |
NAL 单元结构
NAL 单元基本结构(以 Annex-B 为例):
起始码 (Start Code): 0x000001 或 0x00000001
NAL Header(1 字节): |F|NRI| Type|
Payload(变长): 编码图像、参数等
字段 | 说明 |
---|---|
F | forbidden_zero_bit(固定为 0) |
NRI | nal_ref_idc(参考强度) |
Type | nal_unit_type(表示内容类型) |
关键类型:nal_unit_type
Type 值 | 类型说明 | 是否关键帧 |
---|---|---|
1 | 非 IDR 的帧(P/B/I) | ❌ 非关键帧 |
5 | IDR 帧(关键帧) | ✅ 关键帧 |
6 | SEI(辅助信息) | |
7 | SPS(序列参数集) | |
8 | PPS(图像参数集) |
所以:
nal_unit_type == 5
→ 表示这是一个 IDR 帧(关键帧);nal_unit_type == 1
→ 表示普通非 IDR 帧(可为 I、P、B 等);
IDR 帧识别
码流(16进制)示例(部分):
00 00 00 01 65 88 ... ← IDR 帧开始解释:
00 00 00 01 → 起始码
65 → NAL Header = 0x65二进制 0110 0101F=0, NRI=3, Type=5 → IDR 帧
码流(另一个例子):
00 00 00 01 41 ... ← 普通 P/B 帧41 → 0100 0001 → Type = 1 → 非 IDR
I 帧(Intra Frame)
特点:
- 使用帧内预测压缩(不参考其他帧);
- 可独立解码;
- 用作压缩起点或恢复点。
但:不是所有 I 帧 都是 IDR 帧
- 普通的 I 帧 可以被后续 P/B 帧作为参考帧;
- 所以如果你从某个普通 I 帧开始播放,仍可能缺少参考帧,造成花屏或播放错误。
IDR 帧(Instantaneous Decoder Refresh)
特点:
- 是 I 帧的一种特殊类型;
- 在 H.264 的语法中属于 IDR picture;
- 出现 IDR 帧时,所有之前的参考帧立即失效,后续帧 不会引用 IDR 帧之前的任何帧。
作用:
- 解码器会清空参考帧缓冲区;
- 强制视频从此帧开始“清零重建”;
- 是流媒体中的**“关键帧”**,播放器可以从此帧快速切入播放;
- 典型用于 GOP(Group of Pictures)起始帧、场景切换、快速跳转点。
GOP 结构与 IDR 关联
时间线 →
GOP 1: [IDR] P B B P B B P B B↑———— 引用帧只在 GOP 内部 ———↑GOP 2: [IDR] P B B P B B P B B
注意:
- 每个 GOP 的帧只引用其内部的帧;
- IDR 帧确保后续帧 不引用前一个 GOP 的内容;
- 这样可以实现无依赖的片段播放或解码;
- 一个GOP中通常只有1个I帧(即IDR帧);