视频压缩的基本思路

视频其实是一系列连续的图像(帧),比如 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、解码;
  • 正确理解这些概念有助于分析视频流问题、优化性能、调试播放器。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐