872X480
處理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)
推
11/01 16:17, , 1F
11/01 16:17, 1F
→
11/01 16:19, , 2F
11/01 16:19, 2F
→
11/01 16:20, , 3F
11/01 16:20, 3F
→
11/01 16:22, , 4F
11/01 16:22, 4F