编码压缩(I、P、B帧,GOP)
视频为什么需要进行编码压缩
- 一张为$720\times 480$的图像,用YUV420P的格式来表示,其大小为:$720\times 480\times 1.5$约等于$0.5$MB
- 如果是$25$帧,$10$分钟的数据量$0.5M\times 10 \times 60\times 25=7500MB \rightarrow 7G$多
- 视频编码压缩的目的就是降低视频数据大小,方便存储和传输。
图像帧的类型
I帧、P帧和B帧是视频压缩领域中的基础概念,用于提升视频压缩效率、视频质量和视频恢复能力。
I帧能够独立解码,P帧、B帧需要依赖I帧进行解码,如果I帧出现数据丢失,解码就会出现马赛克。
- I帧(关键帧)仅由帧内预测的宏块组成。
- P帧代表预测帧,除帧内空域预测以外,它还可以通过时域预测来进行压缩。P帧通过使用已经编码的帧进行运动估计。
- B帧可以参考在其前后出现的帧,B帧中的B代表双向(Bi-Directional)
【帧内空域】:也叫空间冗余:,像相邻像素之间有较强的相关性,比如一帧图像划分成多个 16x16 的块之后,相邻的块很多时候都有比较明显的相似性。
【时域】:时间冗余,视频序列的相邻前后帧图像之间内容相似,比如帧率为 25fps 的视频中前后两帧图像相差只有 40ms,前后两张图像的变化较小,相似性很高。
I帧、B帧、P帧的读取
1 | 发送顺序 I1 P3 B2 |
这会导致一个问题:【引用B帧代码编码延迟】
读取B2的时候,需要当解码的时候P3、B2解码完毕
为了减小 B 帧带来的延迟,通常有几种方法:
- 减少 B 帧的数量: 减少每组图片(GOP,Group of Pictures)中 B 帧的数量可以降低延迟。通过减少 B 帧数量,编码器不需要等待过多的未来帧来完成当前帧的编码。
- 使用较小的 GOP 大小: GOP 是指在视频编码中,一组连续的帧,其中包含一个 I 帧(关键帧),若干个 P 帧(前向预测帧),以及 B 帧。减小 GOP 的大小会使得 B 帧在视频流中的使用减少,进而降低编码延迟。
- 采用低延迟配置: 一些编码器(如 x264 和 x265)提供低延迟配置选项。这些配置通常会禁用或减少 B 帧的使用,并使用其他策略来减少编码和解码延迟。使用这些配置选项可以帮助实现实时编码。
- 实时流媒体应用中禁用 B 帧: 对于需要极低延迟的应用(如视频会议、游戏直播),可以完全禁用 B 帧。这种情况下,编码器只使用 I 帧和 P 帧,虽然压缩效率会有所降低,但可以显著减少延迟。
- 调整 B 帧参考结构: 一些高级编码器允许配置 B 帧的参考结构,例如双重 B 帧(hierarchical B-frames)或者限制 B 帧仅向前参考。这些配置可以帮助在一定程度上减少延迟,同时保留一定的压缩效率。
GOP、GOP长度
GOP(一组图像,Group of Pictures)
GOP长度
假设1秒25帧常见的视频帧率,10秒钟的数据只有一个GOP
GOP的长度就为$25 \times 10 = 250$
GOP太长会导致的问题:
- 如果GOP太长了,I帧数据异常,这个GOP显示会有问题,导致10秒钟画面不正常
- 拖动播放时,I帧距离太长,点播场景进行视频的seek操作就会不方便
GOP太短会导致的问题:
- I帧码率会上升
对于25帧的视频,一般GOP为$1\sim 2$秒设置一个GOP
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 JasonQian's Blog!