作者erspicu (lpo)
看板AVEncode
标题872X480
时间Fri Oct 31 12:58:29 2008
处理dvd resize的方法因人的主张会有很多细部的不同,
我在这边就谈一下,有怎样的处理方法.有怎样的处理差异.
其实我最早处理dvd,使用的是DVD上附注的AR资讯,AR资讯不是什麽4:3或是16:9,
总之就是实际可见画面在萤幕上的长宽比,每一片都不一定相同,
有的 1.8x:1 有的 2.x:1 ,上下左右黑边都切一切後,
直接用dvd的Aspect Ratio去计算正确的比例就是,
问题是不是每一片dvd都有附带这种讯息,不是非常通用,
那这个方法就暂且不继续讨论,这方法对错怎样,我也没兴趣再讨论.
现在来谈谈别的.
按照既定教学, 720左右切边到704 ,然後以704x480 reszie 到 640x360 ,
这是正确的方法,但是有没有维持正常比例,但是又无损画面呢?
我常觉得人有脑袋,自己思考一下想一下就是,转档玩久了,规则原理知晓,
就可以拥有自己另外的一套.
其实想法很简单, 720左右切8 pixel变成704 , 704x480 reszie 到 640x360 ,
那回推一下如果360要再回推到480,那640得变多少呢? 依照比例计算是 853.3333 ,
这时候最原本是 704 的pixel原来得扩增到853.333才是正确的,如果按照比例来说,
不切边的720得变为多少呢?
853.33 / 704 = x / 720 计算出 x = 872 ,这种东西再简单不过的比例计算推导,
我实在也很懒得把这细部的推导写出,所以我才会说,也可以考虑拉伸720的方式,
当然还好几套拉,反正比例计算 1:1 是 1, 2:2是1 ,3:3还是1,都是1,不是死板的.
其实就算你720x480 -> 640x360 ,误差比例也没超过3%.
至於细部方法的差异,这边来讨论一下
1.按照发布dvdrip的惯例,画面上不得出现无效黑边,因此在你resize後,
还得进行切边的工作,切了无效黑边後会出现什麽情况呢?
长宽可能不被4整除,这在yuv的色彩域取样是不被允许的,至少avisynth无法处理这种长宽
,另外也可能无法被16整除,没办法被H.264规格压制,这时候怎麽办?
a.你可以考虑切割画面到适当倍数为止,我个人讨厌切割到实际画面细节
b.你可以再添加黑边到适当倍数为止,但是很少人这麽作
c.你可以resize到最接近的适当倍数为止,但是比例会微幅度改变,应该没超过1%吧.
2.你也可以整个全压,最後设定AR,保留最多细节,但是有人说这也不正确,
反正变形最多在2%左右,看你自己的取舍.
3.当然你也可以依照过去的教学,看是要704X480 -> 640X360或是640X352都好,高兴就好.
此外有的人虽然不会压成704X480 -> 640X360或是640X352,
但是也不想压到872X480这麽大,说真的需要流量是比较高没错,
其实只要依照比例计算则,你高兴怎麽处理就好,但是在这边其实有一个小问题,
就是在PIXELS的世界里没有所谓的小数,也不是所有比例在计算上都能整除,
一定会有小数,这种小数看个人主张的处理法,四舍五入或是直接舍去 你高兴就好,
只是不管怎样,都会多少存在着这种小数误差,
因此才会说这世界上没有100%正确比例的DVDRIP,甚至於连11/10也都只是大略值.
谈比例,这边就是在谈比例的,但是我实在没有兴趣跟某人讨论,
因此独立成一个新主的主题.
实际上转档转到後来,早期会去在乎正确比例,也使用过教学的东西,
到最後却觉得即使最傻瓜比例误差也最大的方法,误差也是微乎其微,
後来就不是很care这些东西了,有时候像是小数计算上的误差或是压缩编码需要的长宽,
这个本身环节的误差就一定都会有一些在.
至於处理比例,我以前为avisynth写过script,给大家参考一下
任何电脑上的影片(没有带特殊ar的),avs档开启後,加上下面这一段,
都会自动resize和加黑边到正确的比例,雕虫小技,基本比例计算的一些程式码而已,
不过还是给有兴趣的人参考一下
# for QVGA
w = float (Width)
h = float (Height)
rate = int ((w / h) * 1000)
srate = w / h
(rate >1400 )? Eval("""
new_h = 320 / srate
new_h = int (new_h)
new_h = new_h - (new_h%4)
LanczosResize(320,new_h)
add_h = (240 - new_h)/ 2
AddBorders(0,add_h,0,add_h)
"""):Eval("""
""")
( rate >= 1300 && rate <= 1400 )? Eval("""
LanczosResize(320,240)
"""):Eval("""
""")
( rate < 1300 )? Eval("""
new_w = srate * 240
new_w = int (new_w)
new_w = new_w - (new_w%4)
LanczosResize(new_w,240)
add_w = (320 - new_w)/ 2
AddBorders(add_w,0,add_w,0)
"""):Eval("""
""")
※ 编辑: erspicu 来自: 220.129.151.100 (10/31 17:28)
1F:推 jscorpio:好惨,一直否定别人时还顺便否定自己,这种考卷会得零分说. 11/01 16:17
2F:→ jscorpio:dvd就只有正方形和长方形两种,到现在还在640x360. 11/01 16:19
3F:→ jscorpio:与其花时间保留这种小档案倒不如抓别人转的,反正同样都 11/01 16:20
4F:→ jscorpio:失去一堆细节了.玩转档请往高层次发展,例如完美解交错. 11/01 16:22