发布网友 发布时间:2022-04-22 20:23
共1个回答
热心网友 时间:2023-07-14 06:07
在预测之后,编码器将预测帧和实际帧的差值(残差)送入变换和量化。变换是用解相关的方式使数据更易于压缩。量化是一个实际损失信息的步骤,所谓的压缩也就在此处实现:变换的输出值会经过舍入,大部分参数都将变成0,只留下少数整数参数。 对于变换来说,VP8再一次的使用了一个类H.264方案。每个16×16的宏块被分成16个4×4的DCT块,每一个使用一个精确位数的DCT近似进行变换。之后,每个变换块的DC分量被提出成另一个4×4的组,之后对这个4×4的组进行Hadamard变换。OK,到此这不是一个类H.264方案,这就是H.264。但是,VP8的变换方案和H.264有三点不同。
首先8×8变换被完全去除了(这和i8×8模式被去除相对应)。其二是变换本身,H.264使用了一个极其精简的DCT,它是如此的不像DCT以至于经常被人用HCT(H.264 Cosine Transform)代指。这个精简的变换大概能导致1%的压缩率损失,但是大幅精简了变换的运算,它可以完全用加、减和右移一位这三个操作来实现。VC-1使用了一个更精确的版本,它依赖于几个简单的乘法(比如17,22,10等)。VP8使用了一个特别地,不必要地精确版本,使用了非常大的乘法(20091和35468)。回想On2之前在VP3的所作所为,这种实现方法的出现并不惊讶。
第三个不同之处在于Hadamard层级变换还作用于一些帧间预测块中,而不仅仅是i16×16这一种帧内预测模式。具体来说,它也作用与p16×16块中。这是一个非常好的想法,特别是考虑到较小的变换大小(以及对于小范围变换时解相关DC值的需求)。我并不是非常确定我同意将层级变换只限定在p16×16块内,看上去似乎只要经过很少的修改,这样的变换也会对其他运动分块有用。另外,与H.264不同的是,层级变换只作用于亮度块而不作用于色度块。
总体上,VP8的变换方案绝对比H.264弱。缺乏8×8的变换,特别在高分辨率场合,会严重影响对细节的保持。变换本身也非常没有必要的慢,虽然基于位移的变换方案可能会逃过专利问题。其中一个优秀的想法是将层级DC变换应用到帧间预测块中。
对变换的评价:接近于H.264,更慢,略微准确的4×4变换,对亮度DC变换的改进(但是没有对色度的支持)。没有8×8变换。总之,劣于H.264。 对于量化而言,核心的处理方式对于所有类MPEG视频格式都是一样的,VP8也不例外。量化上各种不同标准区分自己的方法就是改变量化阶系数。这里面主要的方法又有两种:基于帧的偏移,其作用于所有或者一部分系数;以及基于宏块的偏移。VP8主要使用的是前者,其方案相比于H.264的自定义量化矩阵而言可伸缩性差了很多。VP8的方案允许分别调整亮度DC分量,亮度AC分量,色度DC分量等诸如此类的对应量化器。后者(基于宏块的量化器选择)从理论上可以利用“分割图”的功能实现,尽管这种实现方式需要相当的技巧并且不是非常高效。
VP8在这里犯得一个致命错误在于没有把基于宏块级别的量化作为VP8的核心特性支持。利用基于宏块级别量化的算法一般被称为“自适应量化”,这种量化对视频主观质量的影响是绝对非常关键的。我在x264里的基于方差的自适应量化算法实现,补丁。编码器的评价一次又一次的证明,没有自适应量化的编码器完全没法与具备的编码器相提并论。
因此,想让自适应量化在VP8上成为可能,对每个有可能被用到自适应的量化器定义一个分割图并对每个宏块的分割图索引进行编码就成了华山一条路。显然这是很没效率且很笨拙的实现方法,哪怕不是最优的MPEG风格delta量化器系统都是一个更好的选择。此外,对于每帧最多4个量化器而言,VP8最多只支持4张分割图。
对量化的评价:当需要进行视觉心理优化(psy-optimization)时,缺乏可简化开发整合良好的自适应量化的VP8会让人头疼不已。总之,比H.264差远了。