视频处理关键知识

1 视频中的概念

1.1 视频图像基础

  • 像素:图像的基本单元,即一个带有颜色的小块

  • 分辨率:图像的大小或尺寸,用像素个数来表示。原始图像分辨率越高,图像就越清晰

  • 位深:存储每位像素需要的二进制位数;位深越大,能够表示的颜色值就越多,色彩越丰富真实

  • 跨距(Stride):图像存储时内存中每行像素所占用的空间。需要正确的设置,否则会出现花屏

  • 帧率:1秒中内图像的数量,单位FPS

  • 码率:视频在1s内的数据量的大小。一般码率越高,视频清晰度越高,存储时占用内存空间就越大,传输时使用流量越多,但还需要结合压缩算法和压缩速度综合考虑

1.2 图像颜色空间

  • 颜色空间分类

RGB:指图像的每一个像素都是分别存储R、G、B三个值,且三个值依次排列存储。顺序不一定是R-B-G,RGB三个颜色有相关性,采集和渲染的时候是RBG
YUV:图像将亮度信息 Y 与色彩信息 U、V 分离开来。Y 表示亮度,是图像的总体轮廓,称之为 Y 分量。U、V 表示色度,主要描绘图像的色彩等信息,分别称为 U 分量和 V 分量

  • YUV分类

YUV 4:4:4,每一个 Y 对应一组 UV
YUV 4:2:2,每两个 Y 共用一组 UV
YUV 4:2:0,每四个 Y 共用一组 UV

  • YUV存储方式

Planar:先连续存储所有像素点的Y,然后接着存储所有像素点的U/V,之后再存储所有像素点的V/U
Packed:先存储完所有像素的Y,然后U、V连续的交错存储
Tips:U和V在一张图片中顺序固定,不同图片U和V谁在前不一定

1.3 缩放算法

  • 图像的缩放算法:插值算法、AI 超分算法

  • 插值算法:使用周围已有的像素值通过一定的加权运算得到“插值像素值”,包括:最近邻插值算法(Nearest)、双线性插值算法(Bilinear)、双三次插值算法(BiCubic)

  • 缩放的基本原理:图像的缩放就是将原图像的已有像素经过加权运算得到目标图像的目标像素。主要包括两个部分:一个是像素位置映射过程;一个是映射位置像素的插值过程。

  • 像素位置映射过程:假设原图像的分辨率是w0xh0,我们需要缩放到w1xh1。那我们只需要将目标图像中的像素位置(x,y)映射到原图像的(xw0/w1,yh0/h1),再插值得到这个像素值就可以了,这个插值得到的像素值就是目标图像像素点(x,y)的像素值

  • 映射像素的插值过程:

视频处理关键知识_第1张图片

2 视频中I帧/P帧/B帧

2.1 什么是I帧?

I帧或关键帧或帧内帧(I-frame or Key-Frame or Intra-frame)仅由帧内预测的宏块组成。

I帧中的每个宏块只能在同一帧内匹配其他宏块,这意味着,它只能利用帧内“空间冗余”来进行压缩。空间冗余是一个术语,用来指单个帧的像素之间的相似性。

I帧在不同的视频编解码器中以不同的形式出现,如IDR、CRA或者BLA。这些不同类型的I帧本质相同:都不存在时域预测。

2.2 什么是P帧?

P帧代表预测帧,除了空域预测以外,它还可以通过时域预测来进行压缩。P帧参考前面的帧进行运动估计。P帧中的每个宏块都可以被:

  • 时域预测
  • 空域预测
  • 跳过(skipped)(是指让解码器复制前一帧内的位于相同位置的宏块——0运动向量)

视频处理关键知识_第2张图片

上图中显示了I帧和P帧。如前面讨论,P帧参考前面的I帧或者P帧。图中,帧的编码、解码顺序与它们呈现在用户面前的顺序一致。这是因为P帧只参考前面的图像来进行编码。

2.3 什么是B帧?

B帧可以参考在其前后出现的帧。B帧中的B就代表双向(Bi-Directional)。如果你的视频编解码器使用基于宏块的压缩(如H.264/AVC所做的一样),那么B帧中的每个宏块都可以:

  • 后向预测(使用未来的帧)
  • 前向预测(使用过去的帧)
  • 无帧间预测,仅帧内预测
  • 完全跳过(帧内或帧间预测)

由于B帧可以参考和插入在它之前和之后发生的两个(或更多)帧(在时间维度上),所以它可以显著降低帧的大小,同时保持视频质量。B帧能够利用空间冗余和时间冗余(未来的帧和过去的帧),这使得它在视频压缩中非常有用。

但是,B帧是资源密集型——无论是从编码侧还是解码侧看,让我们来看看原因。

想要理解B帧的作用,我们需要先理解呈现/显示顺序和解码顺序的概念。

以I帧和P帧为例。如果你只使用这两种类型的帧,那么每一帧要么参考自身(I 帧),要么参考前一帧(P 帧)。因此,帧可以以相同的顺序进出编码器。这里,呈现顺序(或显示顺序)与编码、解码顺序相同。

视频处理关键知识_第3张图片

但如果某一帧要参考未来显示的一帧,你要怎么做呢?这是我们在使用B帧压缩时经常遇到的情况。下图中显示了一个GOP(group of pictures)结构,GOP是一组连续的画面,在每一个mini-GOP中,都使用了两个B帧和一个P帧,也就是IBBPBBP。

视频处理关键知识_第4张图片

解码器端也是如此操作。

按照解码顺序,解码器先解码帧1(I帧),然后是帧2(P帧)。但它却无法显示帧2,因为在解码顺序中的实际上是帧4!所以,解码器需要将帧2(按解码顺序)放入缓冲区,然后等待显示它的时机。

所以,编码器和解码器需要在内存中维护两个“顺序”或“序列”:一个将帧放置在正确的显示顺序中,另一个用于将帧按照编码和解码所需顺序放置。

由于重新排序的要求,B帧会影响解码器缓冲区的大小,并增加延迟。

这就是为什么许多系统在压缩一个B帧时,对可用作参考的帧数做出严格的限制的原因。按照同样的思路,H.264/AVC的Baseline profile因为瞄准低端设备的,所以不允许使用B帧或Slice。

2.4 参考B帧和非参考B帧

我们在上文中学过,B帧可以参考两帧或者多帧,通常,(根据其位置)一帧在前,一帧在后。我们也已知道,I帧不参考任何帧,P帧只参考前面的帧。那么问题来了——任何帧都能使用B帧作为它的参考帧吗?

答案是肯定的。

  • 如果B帧可以作为参考帧,它就被称为参考B帧。
  • 如果B帧不用作参考帧,它便被称为非参考B帧。

在比特流中标明参考B帧和非参考B帧非常重要,因为解码器需要在DBP(Decoded Picture Buffer,解码图像缓存)中存储参考帧。

如果某一帧被标记为非参考B帧,但却将其用作参考帧,那么解码器很可能崩溃。因为解码器大概率在解码和显示之后就已经删除此帧。

与非参考B帧相比,大部分解码器在量化参考B帧时会获得更好的质量,从而减少传播损失。

2.5 在视频压缩/流化中使用I、P和B帧

在理解了I帧、P帧和B帧的工作原理之后,我们来解决一个重要问题:为什么要使用它们?

在下面内容中,我们会学习I帧、P帧和B帧在视频压缩中最重要的用例。

在哪里使用I帧?

我们在前面的部分了解到,I帧可以被独立地编码、解码,这使得它在视频压缩中得到广泛应用。

刷新视频质量

I帧的插入通常表示GOP(或视频片段)的结束。I帧压缩不依靠前一帧编码,从而可以刷新视频质量。正因为I帧在保持视频质量方面有如此重要的作用,所以通常情况下,编码器会在大小和质量方面偏向I帧。在编码高质量的I帧后,编码器便可以使用该I帧作为参考图像来压缩P帧和B帧。

那I帧只能用于刷新视频质量吗?不仅如此。

恢复比特流错误

我们之前说过,I帧可以被独立地编码和解码。这意味着I帧可用于恢复视频文件或视频流中的灾难性故障。

我们来看看是它是如何做到的。

如果P帧和参考B帧遭到破坏,其他所有依赖于它们的帧就不能完整解码,这会直接导致视频故障。视频通常无法从此类问题中恢复。然而,当被破坏的视频流到达I帧,因为I帧被独立地编码解码,所以视频问题可以从I帧恢复。

这种I帧通常被称为IDR帧(Instantaneous Decoder Refresh,即时解码刷新),并且这种不参考I帧之前图像的行为被称为闭合GOP(Closed GOP)。

IDR帧通常在ABR流中表示视频的某个新片段。由IDR帧开始,平台可以确保新片段能够独立于其他片段被解码。即使由于传输问题导致一些片段损坏或丢失,这一特性也能保证视频可以继续播放。

Trick Modes(快进快退)

最后,关键帧对于Trick Modes来说至关重要!

如果想在一个视频中快进快退,则在视频开始时需要一个I帧,对吧?

假设你搜索到的是P帧或者B帧,但解码器已经从内存中删除了参考帧,你该怎么重建它们呢?视频播放器很自然地会找到一个起始点(I帧)并成功解码,然后从这一点开始播放。

这又引出另一个有趣的事情。

如果你的关键帧在视频中相隔时间很长,假设它们之间间隔20秒,那么你的用户只能以20秒为增量进行快进快退,这样的体验非常糟糕!

如果关键帧放置太多,那么虽然快进快退体验会很棒,但这时候视频就太大了,可能导致网路缓冲等问题。

所以设计出最佳的GOP和mini-GOP结构真的是一项平衡的艺术。

2.6 在哪里、什么时候以及如何使用P帧和B帧?

如果你已经理解上文中所描述的P帧和B帧的工作原理,那么你就知道P帧和B帧可以在减少视频大小的同时,保证视频质量。这就是它们的主要用途!在合适的位置插入P帧和B帧可以减小视频文件尺寸或者比特率,并且仍能保持一定的视频质量水平。

基于你所使用的GOP和mini-GOP结构,使用相关QP值压缩P帧和B帧(被参考或者不被参考),你就可以达到目标比特率或视频质量。

你可能感兴趣的:(音视频处理,人工智能,视频,I帧)