视频为什么需要进行编码压缩

  • 一张为$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
2
3
4
5
6
7
8
发送顺序       I1        P3        B2
第1帧为I帧 第2帧为P帧 第3帧为B帧

解码顺序 I1 P3 B2

读取顺序 I1 B2 P3

显示顺序 I1 B2 P3

这会导致一个问题:【引用B帧代码编码延迟

读取B2的时候,需要当解码的时候P3、B2解码完毕

为了减小 B 帧带来的延迟,通常有几种方法:

  1. 减少 B 帧的数量: 减少每组图片(GOP,Group of Pictures)中 B 帧的数量可以降低延迟。通过减少 B 帧数量,编码器不需要等待过多的未来帧来完成当前帧的编码。
  2. 使用较小的 GOP 大小: GOP 是指在视频编码中,一组连续的帧,其中包含一个 I 帧(关键帧),若干个 P 帧(前向预测帧),以及 B 帧。减小 GOP 的大小会使得 B 帧在视频流中的使用减少,进而降低编码延迟。
  3. 采用低延迟配置: 一些编码器(如 x264 和 x265)提供低延迟配置选项。这些配置通常会禁用或减少 B 帧的使用,并使用其他策略来减少编码和解码延迟。使用这些配置选项可以帮助实现实时编码。
  4. 实时流媒体应用中禁用 B 帧: 对于需要极低延迟的应用(如视频会议、游戏直播),可以完全禁用 B 帧。这种情况下,编码器只使用 I 帧和 P 帧,虽然压缩效率会有所降低,但可以显著减少延迟。
  5. 调整 B 帧参考结构: 一些高级编码器允许配置 B 帧的参考结构,例如双重 B 帧(hierarchical B-frames)或者限制 B 帧仅向前参考。这些配置可以帮助在一定程度上减少延迟,同时保留一定的压缩效率。

GOP、GOP长度

GOP(一组图像,Group of Pictures)

image-20240816151436332

GOP长度

image-20240816152036564

假设1秒25帧常见的视频帧率,10秒钟的数据只有一个GOP

GOP的长度就为$25 \times 10 = 250$

GOP太长会导致的问题:

  1. 如果GOP太长了,I帧数据异常,这个GOP显示会有问题,导致10秒钟画面不正常
  2. 拖动播放时,I帧距离太长,点播场景进行视频的seek操作就会不方便

GOP太短会导致的问题:

  1. I帧码率会上升

对于25帧的视频,一般GOP为$1\sim 2$秒设置一个GOP