PS.更多的图请看
http://www.dgwxx.net/nmmbbs/viewthread.php?tid=622,全折腾过来太慢了……
4月17日更新,发布PDF版,方便离线浏览:
http://www.vempx.net/vempx/download/NMM_YC_Test_v1.1.rar4月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秒钟的短片。
- #AVS代码1:
- ImageSource ("colorbar.bmp",end=149)
- 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时使用下面代码
- #AVS代码2,部分实验upconv参数有改动:
- loadplugin("e:\gk\dgmpgdec\DGDecode.dll")
- 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一条途径。
我们先看相对简单的DGMPGDecDGMPGDec的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拉伸。
再来看M2VM2V可以通过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都这样。