三种帧类型介绍:I、P、B 帧
I 帧是完整图像,P/B 帧是压缩的差异图像;视频压缩就是“保存关键图像 + 补充变化部分”;I 帧决定是否能独立播放、seek、解码;
·
视频压缩的基本思路
视频其实是一系列连续的图像(帧),比如 30fps 的视频,每秒有 30 张图片。如果每一帧都完整保存,就像保存 30 张高分辨率图片,数据量极大。
为了节省空间,视频编码采用了只保存变化部分的思想。
| 类型 | 全称 | 是否可独立解码 | 是否参考其他帧 | 特点 |
|---|---|---|---|---|
| I 帧 | Intra-coded frame(内部编码帧) | 是 | 否 | 类似一张完整的图片,体积最大 |
| P 帧 | Predictive-coded frame(预测编码帧) | 否 | 只参考前面的帧 | 保存相对于前一帧的变化,体积较小 |
| B 帧 | Bi-predictive-coded frame(双向预测编码帧) | 否 | 参考前后两帧 | 压缩效率最高,但对解码器要求更高 |
假设我拍了一个人挥手的视频,帧序列如下:
帧序号:1 2 3 4 5 6
类型: I → P → B → P → B → P
- 第 1 帧是 I 帧,存储了完整图像;
- 第 2 帧是 P 帧,只记录与第 1 帧的差异(比如手动了一点);
- 第 3 帧是 B 帧,同时参考第 2 帧和第 4 帧;
- 第 4 帧是 P 帧,参考第 1 帧或第 2 帧。
Group of Pictures (GOP)
视频编码会以 GOP(图像组)为单位组织帧结构:
- 一个 GOP 通常以一个 I 帧开始,后面跟若干个 P/B 帧;
- 比如:
I → B → B → P → B → B → P → B → B → I
GOP 的长度和结构会影响:
- 视频质量
- 文件大小
- 解码延迟
- 快进/倒退性能
不同帧的作用总结
| 帧类型 | 用于 | 特点 |
|---|---|---|
| I 帧 | 快速定位、seek、关键帧重建 | 体积大,但可独立解码 |
| P 帧 | 减少冗余、压缩文件 | 只存前帧的差异 |
| B 帧 | 提高压缩效率 | 同时参考前后帧,压缩比最好但解码复杂 |
如何识别 I 帧
1、从解码标志位判断(准确):
如果接收的是原始 frame 数据,通常能获取如下标志:
frame->flags & FRAME_FLAG_KEY_FRAME
如果设置了,说明是 I 帧(关键帧)。
2、从 NAL Unit 判断(H.264):
H.264 的 NAL 单元有个类型字段:
- 类型 5:IDR 图像(I 帧)
- 类型 1:非 IDR 图像(P/B 帧)
3、从帧大小推测(经验法):
- I 帧体积一般较大(数 KB 到几 MB);
- P/B 帧体积相对小很多(几百字节到几 KB);
- 这个方法适合只有日志时使用,例如,viewer端的日志。
2025-06-25 09:57:02.772 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 0 2025-06-25 09:57:02.788 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140320577063552, Size: 4458, Flags 3871328152 2025-06-25 09:57:02.793 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.813 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.828 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140320577063552, Size: 263, Flags 3871328152 2025-06-25 09:57:02.833 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.853 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.868 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140320577063552, Size: 314, Flags 3871328152 2025-06-25 09:57:02.873 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.893 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.908 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140320577063552, Size: 825, Flags 3871328152 2025-06-25 09:57:02.913 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.933 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.948 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140320577063552, Size: 1066, Flags 3871328152 2025-06-25 09:57:02.953 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.973 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140320577063552, Size: 160, Flags 3871328152 2025-06-25 09:57:02.988 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140320577063552, Size: 1029, Flags 3871328152
常见应用场景
| 场景 | 对 I 帧的需求 |
|---|---|
| 视频点播 | I 帧要分布均匀,便于拖动快进 |
| 直播 | 通常 GOP 较长,减少带宽压力 |
| 安防监控 | 通常每秒一个 I 帧,便于回放恢复 |
| 编码质量调优 | 调整 I 帧间隔、GOP 结构可优化码率和画质 |
【总结】
- I 帧是完整图像,P/B 帧是压缩的差异图像;
- 视频压缩就是“保存关键图像 + 补充变化部分”;
- I 帧决定是否能独立播放、seek、解码;
- 正确理解这些概念有助于分析视频流问题、优化性能、调试播放器。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)