搜索 社区服务 统计排行 帮助
  • 13835阅读
  • 68回复

DVDRIP过程中YC伸张与YC压缩的实验(发布离线pdf版)

楼层直达
级别: 工作组
注册时间:
2002-10-27
在线时间:
0小时
发帖:
1165
PS.更多的图请看http://www.dgwxx.net/nmmbbs/viewthread.php?tid=622,全折腾过来太慢了……
4月17日更新,发布PDF版,方便离线浏览:
http://www.vempx.net/vempx/download/NMM_YC_Test_v1.1.rar

4月16日中午12:00更新:
mpeg2source不会进行YV伸张,而是直接输出原始数据。谢谢qyqgpower 指出。

4月16日早7:00更新:
添加了测试用影片,测试您播放时的YC伸张是否准确。只有上面的白色是235、下面的白色是255时才是正确播放。
http://www.dgwxx.net/files/colorbar_for_yc_test.m2v
此外请大家注意到,本文不是我一个人所写,有两部分是VempX所写的哦~大家不要忘记他。
============================================
正文:
YC伸张与YC压缩是一个从Silky大人时代就留下来的古老问题。包括我在内的很多人都没搞明白,制作和播放的时候提心吊胆,生怕弄错了颜色。最近正好没事,进行了一系列的实验,看看YC伸张和YC压缩到底是真么回事。本文的阅读对象是已经知道YC问题的由来,但不知道如何处理的读者,如果您还不知道什么是YC伸张和压缩,推荐您先去复习一下Silky的文章。
本次实验分为四个部分,分别是准备篇、AVS篇,AU篇和播放篇,由我和VempX分别进行自己熟悉的部分。
限于作者水平,或许会有疏漏错误,请多指教。

准备篇
By Dgwxx.
为了正确判断出软件是否进行了YC伸张和压缩,就需要一把标准的尺子,因此彩条Colorbar成了最合适的尺子。因为普通的彩条难以判断黑、白、红、绿、蓝的范围,所以我们用Photoshop制作一张专门用来判断颜色、亮度范围的640*480的彩条图片,保存为24bit bmp格式。彩条上半部分的颜色范围为16~240,黑白部分为16~235(601 Range)。下半部分全部为0~255(Full range),用于进行对比。
之后,使用使用以下AVS代码将bmp图片生成一个5秒钟的短片。
  1. #AVS代码1:
  2. ImageSource ("colorbar.bmp",end=149)
  3. AssumeFPS("ntsc_video")
将这个短片送入TMPGEnc压缩成MPEG2格式。压缩时,打开TMPGEnc的YC压缩选项,此时图像上部为30~217,下部为16~235。
观察时:

    [*]图像上部为30~217、下部为16~235,则没有进行YC伸张。
    [*]图像上部正常回复为601 Range、下部为Full range则判断为进行了一次YC伸张。
    [*]如果上下全都变成了0~255的Full range,则是进行了两次YC伸张。

只有中间的结果是正确的。
观察AVS时使用下面代码
  1. #AVS代码2,部分实验upconv参数有改动:
  2. loadplugin("e:\gk\dgmpgdec\DGDecode.dll")
  3. mpeg2source("colorbar_with_yc_compress.d2v",upconv=[b]0[/b])
AVS篇
By VempX.
AVS压DVDRIP主要来源于DGMPGDec。
通过对彩条的观察得知,通过VDM打开AVS,会发现无论YUV-> RGB选项如何选择,画面都会是Full Range,也就是0-255,这是为什么呢?因为YUV是无法直接在PC上显示的,必须转成RGB才能显示出来。VDM会自动调用系统的ColorSpace转换滤镜进行转换,这个转换过程会做一次YC伸张,所以在VDM里显示出来的色彩会是Full Range。DGMPGDec解码出来的仍然是没有进行YC伸张的原YV12数据。而vfapi插件、预览图像、保存BMP选项受菜单中YUV -> RGB的影响,PC Scale会进行YC伸张,而TV Scale不会进行YC伸张(注意,是“不伸张”,而不是“压缩”!)。
所以AVS里的是原始的YV12数据,再次强调一下,除了全程YV12之外,不要在AVS里动颜色!

正确的图:


Aviutl篇
By Dgwxx.
首先我们拿到DVD之后需要进行的是解码。对于AU来说,解码主要分为两个解码器、三条途径。两个解码器分别是M2V和DGMPGDec。M2V与AU结合有两条途径,分别是aui与vfapi。而DGMPGDec与AU结合只有vfapi一条途径。
我们先看相对简单的DGMPGDec
DGMPGDec的vfapi插件是DGVfapi.vfp,正式名称叫做DGMPGDec D2V/AVS Reader。不同版本在AU中出现的名称会加上版本号,但基本的名字是这个。如果你注册了DVD2AVI(现在可能很少有人记得这个软件了)的vfapi插件,那么就需要在输入插件的优先顺序调节中将DGMPGDec的优先度调高,避免DVD2AVI的vfapi插件误食引起麻烦。
我们将DGIndex生成的索引文件d2v拖拽到au界面之后,au会通过DGMPGDec的vfapi插件打开这个d2v文件。这一点通过「その他」中「ファイル情報」对话框的「ファイル制御」一项确认。
DGIndex及DGMPGDec控制是否进行YC伸张的秘密在于DGIndex中Video菜单下YUV -》 RGB选项。这个选项对于DGIndex的预览图像、File菜单下的Save BMP选项、vfapi解码得到的图像起作用,对于其avs解码插件mpeg2source不起作用,mpeg2source不会进行YC伸张,回直接输出原始数据。
用文本编辑器打开.d2v文件之后就会发现有一个项目叫做YUVRGB_Scale,对应YUV -》 RGB的选项,当值为1的时候,vfapi解码器会做YC拉伸,否则不会。这个选项在avs中使用mpeg2source载入d2v的时候会被忽视,不做YC拉伸。

再来看M2V
M2V可以通过vfapi方式与AU结合(m2v.vfp),同时也具备专供AU的输入插件(m2v.aui)。前者经注册后在AU中的名字是MPEG-2 VIDEO Plug-In,后者的名字是MPEG-2 VIDEO File Reader。前者向AU输出RGB颜色空间,后者则是YUY2。使用的时候一定要注意想要把解码任务交给谁,调整好插件的优先级。
M2V调节是否做YC拉伸的选项在于m2vconf.exe中YUV Range一项。这里调节的是片源的属性,而不是输出的属性。
当选择ITU-R BT.6011 Range的时候,MPEG-2 VIDEO Plug-In会进行YC拉伸。
当选择Full Range的时候,MPEG-2 VIDEO Plug-In不会进行YC拉伸。
也就是说YUV Range只对MPEG-2 VIDEO Plug-In起作用,而MPEG-2 VIDEO File Reader则始终会进行YC拉伸。
YUY2 Matrix选项与YC压缩拉伸无关,是选择MPEG-2 VIDEO File Reader颜色转换公式用的。

播放篇
By VempX.
我们用一个色彩正确的ColorBar方案用AVS脚本,并直接送给x264压制,得到了一个mp4,现在我们知道这个mp4的颜色是正确的。

播放器:Media Player Classic Home Cinema
解码器:ffdshow
分离器:Haali
显卡: GeForce 8600GT

我会试图用几种组合告诉大家如何得到正确的播放结果。

1. VRM9无渲染+ffdshow YV12输出 颜色错误

2. VRM9无渲染+ffdshow RGB32输出 颜色正确

3. Haali渲染器+ffdshow YV12输出颜色正确

4. 覆盖合成器+ffdshow YV12输出颜色错误(存疑)

5. 覆盖合成器+ffdshow RGB32输出颜色正确


首先来说RGB,当YUV转换到RGB时,就已经做了一次YC伸张,所以颜色已经是正确的,VRM9渲染器是无法对RGB色彩数据做处理的,所以最后会得到正确的结果。
而Haali的渲染器,功能可谓十分强大。它可以自动判断601或709,并且可选是否做YC伸张。当使用Haali的渲染器时,他会根据视频窗口大小和视频源分辨率来自动做不同的高品质Resize,品质要远远高于播放器自带Resize。
这两个方案都有各自的弊端。Haali的渲染器现在还不能用它打开硬解。ATI的显卡貌似也是同样的问题(感谢冰冷的心提供资料),而且ATI的显卡还可能存在Resize的瑕疵。覆盖合成器无法保存图像和使用QQ截图,十分不方便。RGB输出对系统资源消耗太大。
这时我们就要用到VRM9无渲染的厉害功能了。我们使用VRM9无渲染,在播放时单击右键,可以找到渲染菜单,里面默认会有一个16-235 -> 0-255,我们勾上这个,就会得到YC伸张的画面了,也就是正确的颜色。
所以,我推荐的组合是,VRM9无渲染+ffdshow YV12输出+shader着色器YC伸张。当然如果你的机器足够强,你还可以用Haali渲染器+ffdshow YV12输出的组合,除了不能开硬解,其他都近乎完美,缺点是系统资源消耗较大。

话说帖一张有意思的图:

我怀疑是不是我弄错了,AU的误差怎么这么大了,连他自家的m2v都这样。

dgwxx.com
shanque.net
nmm-hd.org
级别: 圣骑士
注册时间:
2003-02-20
在线时间:
79小时
发帖:
1605
只看该作者 68楼 发表于: 2009-10-19
这个坟。。。。反正这个问题到现在还是很难弄

嗯。。。
级别: 新手上路
注册时间:
2006-04-16
在线时间:
0小时
发帖:
1
只看该作者 67楼 发表于: 2009-10-19
找不到收藏,人肉mark。
级别: 精灵王
注册时间:
2005-12-13
在线时间:
0小时
发帖:
3859
只看该作者 66楼 发表于: 2008-04-23
引用
最初由 qyqgpower 发布
shader也可以在ini里添加,在[shaders]下面加一行就行了
数字=16-235 -> 0-255|ps_2_0|sampler s0 : register(s0);\n\n#define Const_1 (16.0/255.0)\n#define Const_2 (255.0/219.0)\n\nfloat4 main(float2 tex : TEXCOORD0) : COLOR\n{\n return( ( tex2D( s0, tex ) - Const_1 ) * Const_2 );\n}


= = 显卡不支持的话会不会造成RP现象?

= =
级别: 新手上路
注册时间:
2008-04-09
在线时间:
0小时
发帖:
179
只看该作者 65楼 发表于: 2008-04-20
谢谢LS二位解答,已经找到了原版的MPC6490,果然原版是有的,从此放弃乱七八糟的汉化版
级别: 侠客
注册时间:
2005-02-09
在线时间:
0小时
发帖:
512
只看该作者 64楼 发表于: 2008-04-20
shader也可以在ini里添加,在[shaders]下面加一行就行了
数字=16-235 -> 0-255|ps_2_0|sampler s0 : register(s0);\n\n#define Const_1 (16.0/255.0)\n#define Const_2 (255.0/219.0)\n\nfloat4 main(float2 tex : TEXCOORD0) : COLOR\n{\n return( ( tex2D( s0, tex ) - Const_1 ) * Const_2 );\n}
级别: 新手上路
注册时间:
2005-12-14
在线时间:
0小时
发帖:
152
只看该作者 63楼 发表于: 2008-04-20
引用
最初由 Izumi Nova 发布
我想问两个问题
1:为什么我在ffdshow的输出里选了YV12(只选了YV12),渲染器选haali,播放时渲染器自动切换为video renderer,只有haali渲染器+YV12会出现这个问题。显卡是X550,播放器MPC6.4.9.0Rev.611
2:我用的播放器的渲染菜单没有16-235 -> 0-255,貌似有些home cinema也没有,求版本

home cinema版的mpc就是没有那个shader,不过源代码里有,自己编译时把注释符去掉就可以了

现阶段装备:
Core 2 Quad Q6600 2.4GHz / GIGA-BYTE 965P-DS3 (Rev 1.0)
DDR2 800 1G *4 (A-Data *2 + Apacer *2)/ PowerColor HD3870 (512M/256b GDDR4)
Seagate 7200.10 SATA 320G *2 + WD 320G AAKS SATA / NEC DVD RW ND-4570A
AOC 203VW (20", 1680*1050, 5ms)
USB Devices:
WD 200G IDE2USB / SONY DW-G120A
级别: 工作组
注册时间:
2002-10-27
在线时间:
0小时
发帖:
1165
只看该作者 62楼 发表于: 2008-04-20
我也注意到了这个现象,haali只吃yuy2以上的数据,如果ff里面选了很多颜色空间的话,ff会自动输出yuy2,而如果只选yv12的话,haali就会罢工。
这点我在另一个帖子《播放过程中YC伸张的实验 》里面也提到了。

dgwxx.com
shanque.net
nmm-hd.org
级别: 新手上路
注册时间:
2008-04-09
在线时间:
0小时
发帖:
179
只看该作者 61楼 发表于: 2008-04-20
我想问两个问题
1:为什么我在ffdshow的输出里选了YV12(只选了YV12),渲染器选haali,播放时渲染器自动切换为video renderer,只有haali渲染器+YV12会出现这个问题。显卡是X550,播放器MPC6.4.9.0Rev.611
2:我用的播放器的渲染菜单没有16-235 -> 0-255,貌似有些home cinema也没有,求版本
级别: 精灵王
注册时间:
2005-12-13
在线时间:
0小时
发帖:
3859
只看该作者 60楼 发表于: 2008-04-18
= = 我来看新版了

= =
级别: 工作组
注册时间:
2002-10-27
在线时间:
0小时
发帖:
1165
只看该作者 59楼 发表于: 2008-04-17
N记的显卡是从GeForce 3系列开始支持PS1.0的,对于2.0a的支持则是从GeForce FX系列开始的,6系列、7系列支持3.0,8系列、9系列支持4.0。我现在的Intel GMA X3100的测试版驱动似乎开始支持PS4.0了来着……

dgwxx.com
shanque.net
nmm-hd.org
级别: 骑士
注册时间:
2005-01-04
在线时间:
0小时
发帖:
1138
只看该作者 58楼 发表于: 2008-04-17
引用
最初由 暗影翔 发布

mx440,不支持ps2.0

如果我没记错,别说2.0了,MX440就根本不支持PixelShader,所以你用这卡就别指望Haali渲染器了……

引用
最初由 littlemouse 发布
哎呀!昨天真脑残。
也给vx道歉,没有看清播放篇的作者

:) 没事,不用在意~~

I've Sound音樂聯盟(点击进入)

[CHN][IFS][eDtoon][TLF][VeryCD]VempX <= eMule的ID,欢迎查看共享文件
~My Blog~
级别: 新手上路
注册时间:
2007-11-22
在线时间:
0小时
发帖:
117
只看该作者 57楼 发表于: 2008-04-17
哎呀!昨天真脑残。
也给vx道歉,没有看清播放篇的作者
级别: 精灵王
注册时间:
2005-12-24
在线时间:
45小时
发帖:
2298
只看该作者 56楼 发表于: 2008-04-17
引用
最初由 vempx 发布

囧,我不是大大,叫我VX就可以了

你用的是什么显卡?

mx440,不支持ps2.0

在长长地换硬件的道路上,纠结前进中
级别: 骑士
注册时间:
2005-01-04
在线时间:
0小时
发帖:
1138
只看该作者 55楼 发表于: 2008-04-17
引用
最初由 暗影翔 发布
在我这里,打开haali renderer,图像就是黑的,状态栏显示不能加载shader,是不是显卡不支持ps2.0就不行

囧,我不是大大,叫我VX就可以了
引用
Video Renderer now uses multiple passes instead of complex shaders, and works on PS 1.1 hardware. Bicubic scaling and deinterlacing are available staring with PS 1.4.


你用的是什么显卡?

I've Sound音樂聯盟(点击进入)

[CHN][IFS][eDtoon][TLF][VeryCD]VempX <= eMule的ID,欢迎查看共享文件
~My Blog~
快速回复

限150 字节
上一个 下一个