NMM视频技术(旧)

 找回密码
 成为会员
搜索
查看: 11675|回复: 10

DVDRIP过程中YC伸张与YC压缩的实验

[复制链接]
发表于 2008-4-15 20:00 | 显示全部楼层 |阅读模式
4月16日中午12:00更新:
mpeg2source不会进行YC伸张,而是直接输出原始数据。谢谢qyqgpower 指出。

4月16日早7:00更新:
添加了测试用影片,测试您播放时的YC伸张是否准确。只有上面的白色是235、下面的白色是255时才是正确播放。
http://www.dgwxx.com/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里动颜色!

正确的图:

YV压缩测试用标准彩条

YV压缩测试用标准彩条


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都这样。

VDM导入AVS代码1

VDM导入AVS代码1

AU导入PC Scale d2v(DGMPGDec D2V/AVS Reader)

AU导入PC Scale d2v(DGMPGDec D2V/AVS Reader)

AU导入TV Scale d2v(DGMPGDec D2V/AVS Reader)

AU导入TV Scale d2v(DGMPGDec D2V/AVS Reader)

AU导入m2v(MPEG-2 VIDEO File Reader)

AU导入m2v(MPEG-2 VIDEO File Reader)

AU导入m2v (601 range)(MPEG-2 VIDEO Plug-In)

AU导入m2v (601 range)(MPEG-2 VIDEO Plug-In)

AU导入m2v (full range)(MPEG-2 VIDEO Plug-In)

AU导入m2v (full range)(MPEG-2 VIDEO Plug-In)
发表于 2008-4-16 07:15 | 显示全部楼层
用VRM9+RGB32确实会自动做YC伸张,我的MPC里面勾了YUV Mixer导致了颜色错误,更正一下。
感谢qyqgpower指出~

[ 本帖最后由 VempX 于 2008-4-16 07:18 编辑 ]
发表于 2008-4-16 15:00 | 显示全部楼层
对了,也许是老问题
我发现Megui压x264出来颜色都会不同,那是什么问题呢?
就是压好后用mpc打开 vmr9renderless + ffdshow 默认(其实不知道怎么改ffdshow输出),截图
和mpc打开avs,decode和上面相同,截图

avs没用colormatrix

压好的片子颜色会相对暗淡

ps....能不能提供silky的那篇文章
发表于 2008-4-16 15:51 | 显示全部楼层
https://www.dream4ever.org/showthread.php?t=439
发表于 2008-4-16 16:34 | 显示全部楼层
谢谢饭团~
发表于 2008-4-17 00:02 | 显示全部楼层
1. VRM9无渲染+ffdshow YV12输出 颜色错误?
这一点有异议。
不同显卡应对pc显示器和彩电的模式不同。
思路上讨论过,vmr9输出YV12,对于geforce显卡来说,是不做yc伸张的,目的是保持图像原始信息,但是对于pc显示器上色彩灰暗,对于接彩电的用户就有正确的色彩和色阶了。
ati显卡则不同,vmr9是做yc伸张的(我没有ati,没有验证),pc显示器色彩正确,彩电损失色阶。

所以我(geforce 6200)用ffdshow +mpc(vmr9 renderless)播放h264或mpeg2文件,还需要mpc开shaders 16-235->0-255就可以在pc显示器上看到正确的颜色了,还能正常挂字幕。很方便。

ffdshow解码不开滤镜的时候都是输出原始画面的。
而其他解码器,比如coreavc powerdvd等就有所不同,内置了滤镜,而且有时候是默认开启的
所以安装混乱的解码包也会造成结果千奇百怪。
发表于 2008-4-17 01:30 | 显示全部楼层
哎呀,给楼主dgwxx道歉,我没看清楚全文就发表意见了,结论是一致的。
 楼主| 发表于 2008-4-17 09:51 | 显示全部楼层
= =||播放篇是vempx写的
不过没关系,有探究技术的精神就好~大家一起讨论
发表于 2008-4-17 13:36 | 显示全部楼层
对不起vx!昨天真脑残。
也给vx道歉,没有看清播放篇的作者
发表于 2008-4-17 13:44 | 显示全部楼层
囧,这边也道歉啊……没事啦~~
发表于 2008-4-19 14:22 | 显示全部楼层
pdf版
更新Ver1.1版
下载地址:
http://www.vempx.net/vempx/download/NMM_YC_Test_v1.1.rar
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

小黑屋|手机版|NMM视频技术

GMT+8, 2025-6-18 07:34 , Processed in 0.278402 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表