您的位置:首页 > 其它

[SilkyBible] XviD系列-13

2008-12-30 21:05 148 查看
引用 07-07-2003

引用silky 兄怎麼最近都沒有出現了呀~~~

如果有時間的話,可否解釋一下 warp points 是蝦米? 剛看到 dev-api-4 的 gmc 可以用三個 warp points 了,可惜不懂這有什麼好處 screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);"> 太忙了,加上计算机坏了,现在要上网很困难 >_<

我对 GMC 不太熟,不过我觉得 3 warp points 可能没有太大的帮助 screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">
当使用 GMC 的时候,动作搜寻会先作 Global ME,简称为 GME,如果 GME 的效果不错,这个 VOP 就会被压成一张 S(GMC)-VOP。VOP 是 Video Object Plane 的简写,DivX/XviD 等 MPEG-4 编码器,因为还没有支持任意形状编码(arbitrary shape coding),无法将画面切割,将画面上一个一个的物件(Object)分开压缩,所以一个 VOP 视讯物件平面,就是一整张的 Frame。所以我们可以将 DivX/XviD 的 I-VOP/P-VOP/B-VOP 视为是等于 MPEG-2 的 I-Picture/P-Picture/B-Picture。

S(GMC)-VOP 可以当作是一个 P-VOP,它和 P-VOP 一样,参考前一个 VOP 压缩;不过它的参考对象有两个可以选择,一个是和 P-VOP 一样,前一个重建回来的 VOP,另一个则是将前一个重建回来的 VOP 作一些平移或几何变形的转换处理,以这个变形弯曲(warp)后的画面作为参考对象。
而这个转换计算对应的坐标点,就叫做 warp point。1 warp point (0,0) 的转换式叫做 Translation,可以将整个画面平移,不过用处不大,这种画面传统的 Local MC 就可以得到很好的效果。2, 3 warp points 的转换式叫做 Affine,可以将参考画面作旋转,或是 zoom in/out 放大缩小等处理。4 warp points(VOL 上下左右四个顶点)的变形转换式叫做 Perspective,可以将画面整个扭曲变形。

S(GMC)-VOP 以这个变形后的画面做为参考对象,每个 pixel 经过变形转换式计算后的处理,等于每个 pixel 都各自经过一个自动的 MV 补偿。所以使用 GMC 的 Macroblock,不用记录该 Macroblock 的 MV 作 Local MC,而使用 Global MC 作补偿,可以节省记录 MV 的 bit。
而 GMC 对于摄影镜头的移动,zoom in/out 等有很好的补偿效果,效率很高。S(GMC)-VOP 里的 Macroblock 有一个 bit 的 flag,叫做 mcsel,预设是 = 1,使用 GMC,如果设为 = 0,这个 Macroblock 就会切换为使用 Local MC(传统的补偿方式,以重建的前一张画面为参考对象,纪录 Block MV,也就是等于 P-VOP 的作法)。
XviD 会判断目前这个 Macroblock 适不适合做 GMC,如果 GMC 效果不好,XviD 会将这个 Macroblock 压成 mcsel = 0。所以如果 GMC 的判断不好,使用时机错误,最糟的情况,每一个 Macroblock 都要多出一个 bit 的浪费。
所以 GMC 的效率关键,主要还是在于 GME 作得不好,判断准不准确,能不能在适当的时机使用 GMC。至于 4 warp points,我想不出来能用在哪种画面上 screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">

我现在也是在用 cynix 兄编译的版本喔,感谢 screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">

引用 07-24-2003S Frame: S(GMC)-VOP MPEG-4 的正式名称叫做 VOP,不用 Frame

VOP 是一个物件单位,MPEG-4 可以将画面上的每个物体(物件)切割出来,个别压缩,
由许多个 VOP 组成一个画面。
切割的形状可以不是矩形,而是任意形状。
这个功能目前 DivX 5, XviD 都没有做,VOP 就是一整个画面,所以 VOP 等于 Frame
S-VOP 代表 Strip VOP,MPEG-4 可以将静态的背景画面单独切割出来,同一个场景,
好几个画面会用同一个背景,只是位置稍有移动(例如画面慢慢向右移),将背景切割出来,
把好几个画面的背景连接起来,做一次压缩,而不要每个画面都压缩一次,可以省 bitrate。
S(GMC)-VOP 当动态旗标和 GMC 旗标都 == 1 时,这个 VOP 叫做 S(GMC)-VOP,
也就是利用 GMC 做压缩的 VOP。由于它和静态的 Strip VOP 不同,所以我们特别在 S 后面
加上 (GMC) 来标示,这是一个有用到动态 GMC 的 VOP。
什么是 GMC?以前有说过,S(GMC)-VOP 就等于 P-VOP,参考前一个画面压缩,
只是它可以参考的对象有两个,一个是原本的前一个画面,另一个是经过 warp 后的画面。

以上是正式名称,软件中直接简称为 S-Frame

N Frame: Null Frame,空的 FrameFrame 里面什么资料都没有,无法显示这个 Frame 的内容。
压缩的时候,有一定的 bitrate,如果前面的画面太难压缩,用掉太多 bit,到了这个画面时
bit 用光了,无法分配 bit 给这个画面使用,这时这个 Frame 无法压缩,只好 drop 掉,
产生一个空的(Null) Frame
播放时放到这个 Frame,软件会知道这里有一个 Frame 喔,但是压缩时没有数据给他,
所以没有内容可以显示,但是还是要请你等一等,等下一个播放时间点才能显示下一张画面,
不能直接跳掉喔,否则会影音不同步。

N Frame 太多代表 bitrate 不够用,有太多 Frame 没有 bit 可以压缩,只好 drop 掉,
软件会告诉你 Drop Frame 过多,这个文件压得不太好。

不过有例外的情况。
有时候为了特殊目的,我们会故意插入 Null Frame
例如日本动画有一些是 24fps/30fps 混合,因为 AVI 只能有一种显示速率,如果做成 24fps,
30fps 的部分必须砍掉画面,砍成 24fps,画面会一顿一顿的不顺畅。
如果做成 30fps,24fps 的部分必须要重复画面来生成 30fps,画面也还是会顿。

做成 24fps 和 30fps 都不好,那怎么办?
这时只好取两者的最小公倍数 120fps,做成 120fps
24fps * 5 = 120fps
30fps * 4 = 120fps

原本

代码 (双击代码复制到粘贴板)
1 2 3 4   5 6 7 8 9
24fps      30fps

插入 Null Frame
1 x x x x 2 x x x x 3 x x x x 4 x x x x 5 x x x 6 x x x 7 x x x 8 x x x 9 x x x
变成 120fps,这样就可以保留所有的画面,又能很顺畅的播放。

这种档案用软件检查会告诉你有很多 Drop Frame,但是并不是做坏了,那些 Null Frame
是故意插进去的。你用 VirtualDub 检查,会发现 Drop Frame 出现得很有规律
(VirtualDub 会显示 [D] 代表 Drop Frame),每一张后面会有固定四或三个 Drop Frame

看到 120fps 的文件便可以知道,其 Drop Frame 是故意插进去的。

引用 08-08-2003bestdoct 兄

我没有遇到压出来的文件大小会和设定的目标大小差那么多的情况,
我想会不会是您的文件很好压,所以最大也只能压到这么大,没办法再更大了。

是每一个文件压出来都会比设定的小 100MB 还是只有一两个会如此?

您可以检查 1st-pass 压出来的 stats 文件,看看 1st-pass 压出来文件有多大,
如果 1st-pass 压出来就是比您设定的大小小 100MB,
那么 2nd-pass 最大也只能压到和 1st-pass 一样大,没办法再更大了。

或是您可以看 2nd-pass 时,每一个 Frame 的 quantizer 是否都是 2,
如果都是 2,压出来还是比设定的小 100MB,那么也没办法再更大了。

我想如果都是 q=2 压缩,品质应该已经很好了,如果您还想要把文件弄大,
那么可以
1. 提高分辨率
2. 故意把源影片弄得难压一点,例如用很锐利的 resize 法,如 lanczos resize
3. 不要用 B-frame
4. 用 quantizer q=1 压缩,不过这样文件大小无法控制,而且会很大
5. 用 quality 98% 压缩,同时 quantization 设定底下,把 I/P Frame 的 Min quantizer 设为 1,
这样部分 Frame 会用 q=1 压缩,部分 Frame 会用 q=2 压缩,文件大小会比都用 q=1 压缩小,
但是还是无法控制最终文件大小

6. 改用 MPEG quant
7. 自订 MPEG Matrix 压缩,设定很变态的、质量很高的量化矩阵,不是一般普通的矩阵,
这样 1st-pass 压出来文件会非常大,质量会到达目前 MPEG-4 能到达的最高水平,
什么 DivX Manihi q=1 都比不上,直逼源 MPEG-2 的水准,然后再设定 2-pass 压缩,
压到您要的文件大小

使用 7 的方法,只有在追求高质量,不计文件大小,或是 H.263 q=2 压出来还是太小,
q=1 又太大,想用 2-pass 取得平衡,才会使用这个方法,同时设定的量化矩阵,必须要有技巧。

如果您的 1st-pass 压出来比 2nd-pass 设定得大,但是 2nd-pass 就是达不到设定的目标大小,
那就很有问题了,我没遇过这种情况,请您将您的 1st-pass 设定、2nd-pass 设定列出来给我们参考一下。

引用 09-19-2003

引用XviD内建的H.263和MPEG的Quant.Matrix分别是多少? 谁能提供一下?
当选择Custom时,那个默认的是不是就是MPEG的QM?
感谢 screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);"> 是的,选择 MPEG Custom 的时候,那个预设的 Matrix 就是 MPEG 所使用的矩阵,这个矩阵是 MPEG-4 standard 的标准矩阵。
intra 矩阵是给 intra-block 使用的,inter 矩阵是给 inter-block 矩阵使用的。

H.263 量化不用矩阵,而是全部 8x8 的 DCT 系数除以一个数字,这个数字的详细算式:


screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);"> 是量化后的系数


screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);"> 是量化前的 DCT 系数

for intra:


screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">

for inter:


screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">

简化的说,intra 除以二倍,inter 除以四倍的 quantizer

MPEG 量化则是除以量化矩阵中相对应的数字:


screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);"> 是量化矩阵中的加权的(Weighting)量化系数
for intra:


screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">

for inter:


screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">

简化的说,系数乘八,再除以量化矩阵中的数字,再除以 quantizer

至于 intra dc(intra-block 最左上角的系数),MPEG-2 和 H.263 standard 都是固定,H.263 standard 固定除 8,MPEG-2 根据 intra dc precision 固定除一个数字,而 MPEG-4 拿掉 MPEG-2 的 non-linear scale code,改成


screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">

除以 dc_scale。
而 dc_scale 会根据 quantizer 做 non-linear scale

代码 (双击代码复制到粘贴板)
quantizer_scale(Qp): 1~4      5~8      9~24      25~31
dc_scale Y         :  8       2Qp      Qp+8      2Qp-16
dc_scale C         :  8    (Qp+13)/2   同左      Qp-6
MPEG 量化是 XviD 的秘密武器,画面非常锐利,CQ2 压缩 细节比 DivX CQ1 压缩还多,同时暗部不会有 H.263 压缩的 block,缺点是 noise 比 H.263 多,尤其是锐利线条周围的 noise,如果能克服这项缺点,你可以用 XviD 压出目前 MPEG-4 的最高画质。

顺便回答量化矩阵的问题:
原本空间上的 8x8 pixels 的值,经过 DCT 转换后,会变成 8x8 个代表空间频率的系数,最左上角称为 dc,代表原空间上 8x8 pixels 值的总和平均。
由 dc 出发,其它系数称为 ac,越往右走的系数,水平空间频率越大,越往下走的系数,垂直空间频率越大。水平空间频率可以想象为水平由左到右,一条条黑白相间的线条的个数,线条越多,越密集,水平空间频率越大。垂直空间频率亦复如是。
越往右下走,水平和垂直空间频率一起增加,水平和垂直黑白交错的线条越密集,花纹越复杂,到最右下角的系数,代表水平和垂直空间频率最大的地方。
一般自然影像,相邻的 pixel 的差别不会太大,也就是说不会 一黑(0)一白(255)一黑(0)一白(255) 这样有巨大的差异交错变化,所以高频的系数通常都为 0。
但是如果遇到画面上有很复杂的材质,例如女孩子纤细的秀发,在很小的范围内,有一丝一丝,细致的发丝,或者生长得很茂盛的草地、树林,或者岩壁上岁月斑驳的痕迹,在很小的范围内,有一个一个的隙孔、纹路... 等等,像这种的地方,就会有很大的高频系数。而这些高频的成分,我们一般称为"细节"。

量化的时候各个频率的 DCT 系数会除以量化矩阵中的数字,除的数字越大,量化的间隔越大,误差也越大。如果除的数字很大,系数又很小,这个系数一除之后就会变成 0,这个高频的系数就会被削掉,再也无法还原。
因为我们人眼对高频较不敏锐,所以根据 HVS 的特性,量化的时候高频会除多一点,所以量化矩阵中,通常高频的数字会比较大。
H.263 量化都除同一个数字,就无法利用这个优点。
同时 H.263 量化的 uniform quantization 做法,高频削一部份,同时低频也削去一大部分,这样会使得画面较为模糊。

设置矩阵是一个很大的学问,MPEG 量化什么都好,就是 noise 太多,如果我们可以设置一个矩阵取代原本的预设矩阵,使得 noise 减少,尤其是锐利线条周围的 noise 减少,接近 H.263 干净的画面,那么就可以取两者之优点,做到最高品质。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: