现代的codecs,像H.265和VP9采用的是混合、基于块预测的架构,如下图所示:
在这个模型中,视频序列的每一帧图片会被分为帧内预测和帧间预测帧,就是我们所说的I帧和P、B帧,编码器对于复杂的场景变换自动插入I帧,并且会有自己的检测算法。以下详细描述整个视频编码流程:
1、拆分块:每一帧拆分成块形状区域:H.264的macroblocks,即我们说的16x16;VP9的64x64;H.265的CTU(编码树单元);AV1的128x128,然后每一块按照光栅顺序输入到编码管线当中。每一个块还可以递归分区,生成子块,例如VP9的64x64递归分区到4x4。这样做的目的和好处是什么?为了更好地去除空间和时间冗余度,举个例子,如下图所示:
纹理很复杂的区域拥有更小的块(4x4),有利于更好地预测和压缩,相反纹理简单的区域拥有更大的块(64x64),唯一的开销就是要在码流里面添加分区模式而已。
最后一个问题就是怎么选择最优的分区算法?这个就是编码器的挑战,就是如何找到一种分区算法使得编码像素用最少的比特的同时保证最优的视觉效果,一般来讲,编码器会根据特定的场景穷举所有分区模式,选择使用最少编码比特的模式。
2、预测:块内像素之间去除关联性,这个过程发送在同一帧内或者帧间,包括寻找最匹配的预测块(用来生成残余),帧内找到称为帧内预测块,帧外找到称为帧间预测块,帧间预测用到运动信息(运动矢量+参考帧),运动信息和选择的预测模式会在码率里面传输。
3、变换:残余块(当前块和预测块的差值)使用空间变换和更加高效的表示方法而被量化,在变换域中,系数集中左上角。目前视频编码到此阶段还是不失真,即使用反变换和反预测可以得到原来的像素值。
4、量化:变换块被除以一固定数字来减少残余系数个数。
5、排列:使用特定的扫描处理方法来排列系数。
6:商编码:编码系数生成比特码流。
解码器接收到视频码流,使用相反的流程来生成原始的视频流,即解码过程。