这两个参数来控制的。
因为 B-frame 不能拿来做为参考画面,也就是说 B-frame 不会再被其它画面参考到,所以 B-frame
可以压得比较差一点,通常 quantizer 会设得比较高。
这是因为 MPEG 压缩的时候 I-frame 和 P-frame 会被其它画面拿来做为参考画面,
其它画面会参考这两种 frame 来压缩,只纪录和参考画面之间的差异。
参考的时候参考的是压缩过的画面,举例:
I P P P ...
首先第一张 I 独立压缩,压缩完以后再解压缩,还原一张经过压缩过的画面 I'。
第二张 P 要参考前一张画面压缩,此时要参考的是未压缩过的、原本的画面 I,
还是压缩过,再解压缩回来的 I' 画面?
答案是压缩过,再解压缩回来的 I' 画面。
因为 P 纪录的是和前一个画面的差异,解压缩时用前一张画面补上这个差异便能得到正确的画面。
然而解压缩的时候的前一张画面是什么?是经过压缩过的 I',不是原本的 I。
原本的 I 在压缩档里面已经不存在了(当然,不然怎么叫有损压缩 )。
所以我们可以了解,P 要参考的画面必须是压缩过的 I' 画面,要记录的是未压缩的目前的画面,
和前一张压缩过的参考画面之间的差异。
所以,如果前一张 I' 压缩得很烂,它和目前的画面的差异必然很大,必然很不像现在的这张画面。
这样这张 P 就必须提高码率才能记录这么大的差异,如果码率不够用,这张 P 就无法压得很好。
接着后面的 P 又要参考这张前面压得不好的 P..... 如此恶性循环,结果所有的 frame 都无法压得好。
所以会被参考的 I-frame/P-frame 必须要压好一点(或者说要压得正确一点),
尤其是 I-frame是独立压缩,比较不好压缩,需要的码率要大,所以才会有 I-frame boost 这种选项。
(不过要做到 linear-scaling 便不能使用 I-frame boost,前一次忘了提,这里补充)
反过来说,B-frame 不会被参考到,所以可以压得比较不精确一点,所以通常我们会提高
B-frame 的 quantizer 达到高压缩率。
例如 TMPGEnc 的 VBR 和 CQ 压缩模式当中的设定选项「B picture spoilage」
(英文版,中文版我不知道是怎么翻译),就是让你设定 B Frame 相较于 I/P Frame 所要减少的品质。
回过来说 XviD 的 B-frame quantizer 设定。本来只有一个选项「B-frame quantizer ratio」,
用的算式是:
((前面参考画面的 quantizer + 后面参考画面的 quantizer)/2 * ratio)/100
例如前面参考画面的 quant 是 4,后面是 6,ratio 设 200,则 B-frame 的 quant 就是
((4+6)/2*200)/100 = 10
也就是「前后画面的 quant 平均,然后乘上 2」。
不过这种设计你可以看出来很不理想,如果前后的平均 quant 为 10,
中间的 B-frame 的 quant 一下子就会跳到 20。
我们知道 10 和 20 压出来的品质差很多,这种设计 quant 一下跳太快,比较没有弹性,
容易造成某些画面突然发生劣化,出现明显的瑕疵。
所以后来有人建议,才又加上了 offset 这个参数,整个 B-frame 的 quant 算式变成:
b_quant =
(AVG(prev vop quant, future vop quant) * bquant_ratio +
bquant_offset) / 100
也就是
((前面参考画面的 quantizer + 后面参考画面的 quantizer)/2 * ratio + "offset")/100
例如 ratio 设 150,offset 设 50,前后平均 5,则 B-frame 的 quant 就是
(5*150 + 50)/100 = 5*1.5 + 0.5 = 7.5 + 0.5 = 8
这样比较有弹性,前后画面是高 quant 的时候 B-frame 也不会一下劣化太快。