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