当前位置

XviD 压缩后文件大小不符合预期结果的原因和解决方法

Oversized/Undersized explanations - Doom9's Forum 翻译而来

XviD 论坛有一个问题被反复提出:压缩后的文件大小和和指定的大不相同。本文试图解释文件大小不一致的原因,并指出解决之道。

让我们从基础知识开始,要知道弄明白问题发生的根源后就离解决它很近了。

基础知识

1. 量化
XviD 属于有损压缩,即它会把一些认为无用的画面细节忽略掉。每一帧画面会指定一个 quantizer (中文翻译为"量化因子"),然后据此进行压缩。
那么:
量化因子为 1("Q1") 意味着最高质量的图象和最大的文件(高码流)
量化因子为 31("Q31") 意味着最低质量的图象和最小的文件(低码流)

我们的目标是尽可能高的质量,以及尽可能低的码流...
=> 通常不用 Q1 做压缩,因为码流太高了(如果要备份 DVD,还不如保留原始的 MPEG-2 流)
Q2 则能得到很好质量的图像,而且比 Q1 来要小很多(quality/bitrate并不是线型的)。MPEG-4 被设计为低码流应用(相比较 MPEG-2 而言),我们可以假定对于 XviD 压缩来说,Q2 就是最高质量的压缩了。

2. 文件大小
相同的量化因子前提下,不同的视频源压缩后的大小也是不一样的。有的容易压缩,而高分辨率、大量细节、快速动作、明暗变化大的电影则很难压缩。

3. two-pass 压缩(或写成 2-pass)
为了在指定文件大小的情况下得到最大的质量,XviD 提供了 two-pass 处理模式。
- 首先固定量化因子为 2 压缩一遍,产生一组参考数据(stat 文件)
- 根据参考数据进行二次压缩,编码器不断调整码流来优化整体质量

那么就产生了三种情况:
● 1st pass 得到的文件比预料的大,在 2nd pass 压缩中编码器就不得不采取更高的量化因子
● 1st pass 得到的文件比预料的小,那么 2nd pass 中编码器就会在某些帧用 Q1 进行压缩
● 1st pass 得到的文件和预料的一模一样...当然从统计学上来说这是不可能发生的,而且这种情况下我们也不用再继续讨论了

现在问题发生了

有的视频太容易被压缩了(或者说 1st pass 得到的文件比指定的要小很多),于是过多的 Q1 帧被产生,但这会扰乱编码器的码流控制系统,最后就得到了一个 oversized 结果。

oversize的解决方案

1. overflow treatment 设置的调整
该设置被用于在 2nd pass 压缩中,设定码流控制进行调整的强度。取值越大,越能有效平衡 Q1 帧。
那么我的建议值是:
("Encoding type" > Two-pass - 2nd pass > "more...")
- overflow control strength: try 10 or 20
- Max overflow improvement: try 10 or 20
- Min overflow degradation: try 10 or 20

2. Quantizer capping
很简单,就是避免 XviD 用 Q1 压缩。
把每种帧类型[I/P/B]的最小量化因子都设成 2 (最大值还是保留 31)
1.1.0-final 之前是
("Advanced option" > Quantization),
从它以后是
("Quality preset" > Userdefined > "more..." > Quantization)

这样就不再会得到一个超大文件了。但...这种方式也导致根本不再有提高质量以得到预期码流的余地了。

除了上述两种编码器相关的解决方案,其实还有更好的思路:我们的目的是填充剩余的空间,那么就可以用更高的分辨率,更高的音频质量,更高质量的定制矩阵...等等

undersize的解决方案
从上面说的去举一反三吧...

如何提前预料到文件大小无法控制呢?
上面已经提到,1st pass 将产生一个日志文件,里面就包括 Q2 压缩结果的大小。那么如果这个数字和你预期的相差非常远,就很可能发生该问题了。

怎么看到 "size" 信息呢?
用 StatReader 打开该日志文件就可以看到了。该程序被包含在 official release 里面(比如 Koepi build)

Topic: