我测试了一下,这一版的就没问题了。
最近压 Evangelion 的 Renewal OP,这部 DVD 当年做得很糟糕,被列为「不幸的动画 DVD 殿堂」的代表之一。最近日本要重发新版本的 DVD,音效重新制作混音为 5.1 声道,同时影像也重新 telecine,remaster 过。Renewal 后的版本 OP 很好做 24fps 补正,不需要做单张去交错,所以我可以利用 TPRIVTC 这个 filter,使用 Avisynth 2.5 做一次全程 YV12 制作的版本。
以前我不用 Avisynth 2.5 的原因是,我需要用 TMPGEnc 做 24fps 补正,TMPGEnc 的 24fps 补正可以让你一张一张选,选出最完美的画面,这点是 Avisynth 的 IVTC plugin 做不到的。Avisynth 有一个 TPRIVTC 的 filter,这个 filter 可以读取 TMPGEnc 的 .tpr 项目文件的里面的 IVTC 数据,在 Avisynth 里面做和 TMPGEnc 一样的 IVTC 选择。只要你先用 TMPGEnc 做好 24fps 补正,储存项目档 .tpr,然后再用 TPRIVTC 去读取这个 .tpr 即可。可惜的是这个 plugin 的 deinterlace 功能只对应单取奇或单取偶,以及奇偶混合(Double)的方法,没有办法做到 TMPGEnc 里面的「自适应去交错」(Adaptive deinterlace),所以遇到有需要单张去交错的画面时,这个 filter 就不是那么好用了。
总之因为这个 Evangelion 的 Renewal OP 很好补,没有用到单张去交错,所以可以用 TPRIVTC,使用 Avisynth 2.5 做全程 YV12 压缩。
我第一次使用 Avisynth 2.5 的 LanczosResize,结果发现 Avisynth 2.5 的 LanczosResize 在 YV12 模式下有 bug,画面会出现错误的白点。如果先转到 YUY2 模式,再做 Resize,然后再转回 YV12,这些白点就会没有了。
LoadPlugin("MPEG2Dec3.dll")
MPEG2Source("Evangelion Renewal OP.d2v")
LoadPlugin("TPRIVTC.dll")
DoubleWeave().TPRIVTC("Evangelion Renewal OP.tpr")
ConvertToYUY2
LanczosResize(640,480,8,0,704,480)
ConvertToYV12
不知道这是不是我的特例,还是大家在 YV12 模式下做 LanczosResize 都会发生这种问题。
所以我也就顺便测了 Avisynth 2.5、VirtualDub、AviUtl 三个软件的 Lanczos3 Resize 压出来的差异。
以 XviD dev-api-4 CVS 最新版,固定品质 quantizer 2 压缩。首先是 Avisynth 2.5,.avs 档的内容如上,在做 Resize 之前先转为 YUY2,然后再转回 YV12。
要全程 YV12 处理,VDMod 必须要选 Fast recompress。Fast recompress 模式下 VDMod 不会做任何转换的处理,会直接丢 YV12 的数据给 Codec 压缩。
压出来档案大小 71,174,144
如果不转为 YUY2 做 Resize,画面会出现白点,档案会更大一点。
接下来是 VD,.avs 和上面几乎一样,只是拿掉最后三行 Resize 的部分,加上
Crop(8,0,704,480)
用 VD 的 Lanczos3 Resize 必须选 Full processing,是在 RGB32 的模式下工作,然后送 RGB 的 data 给 Codec,由 Codec 做 RGB -> YV12。
压出来档案大小 69,677,056
最后是 AviUtl 的 Resize,用 AviUtl 做好 Resize 之后,以 Avisynth 开启,转成 YV12
avisource("Evangelion Renewal OP_aup_vfapi.avi").ConvertToYV12()
如果不用 VFAPI 做中介,直接用 Avisynth 的 VFAPISource 开启,结果是一样的。
AviUtl 的 RGB 有经过 YC 伸张,范围是 0~255。
压出来档案大小 66,965,504
三个排一起比较
71,174,144
69,677,056
66,965,504
AviUtl 压出来的档案最小。PSNR 我没测,不过固定品质下档案越小在做 2-pass 压缩时越有利,压缩率越高。
我不知道这个差异是怎么来的,有可能是
1. 三者的 Lanczos3 Resize 计算精度不同。Avisynth 的 Lanczos3 是改自 thejam(日本人)写的 lanczos3.vdf(其实是一个 Avisynth 的 filter,可以在 YUY2 模式下工作)。thejam 是改自 AviUtl 的 auf plugin,照理说应该一样。
Avisynth 可以使用 AviUtl 的 plugin,利用 aufilters 加载 AviUtl 的 Lanczos3Resize 就可以测试是不是 Resize 造成巨大的差异,如下
LoadPlugin("MPEG2Dec3.dll")
MPEG2Source("Evangelion Renewal OP.d2v")
LoadPlugin("TPRIVTC.dll")
DoubleWeave().TPRIVTC("Evangelion Renewal OP.tpr")
Crop(8,0,704,480)
Import("aufilters.avs")
AU_1anczos3Resize(640,480)
但是这个 LoadAviUtlPlugin.dll 必须要在有 SSE 指令集上的 CPU 才能跑,所以我无法做测试,有兴趣的人试试看。
2. 全程 YV12 和经过 YUV -> RGB -> YUV 转换所造成的差异。实际上使用 Avisynth 时也没有全程 YV12,要 Resize 之前有转为 YUY2。我试过全程 YV12(会有白点 bug),压出来有大一点,不过差不多,看起来不像是主因。
3. 还没有想到...
我会再研究看看,如果有心得,再上来和大家报告。