October 5, 2008

論畫質...

其實有點掙扎是否應該寫上這一篇分享設定的文章... 因為針對視頻播放領域的相關技術解釋,在這篇文章可能需要很多,而在這方面我的知識是較不嚴謹的,所以...

對於大部分人而言,用電腦觀看影片不外乎就是點兩下播放的事情,最重要的是能看還是能看,畫質上的區別也多半歸咎於硬體上的不同,此篇文章是希望多少能更正一些觀點,並設法達到軟體播放上畫質的最佳設定

先談播放軟體:

市面上數不盡的播放器,有哪些是比較好用的呢? 在這邊需要解釋一下播放器與解碼器是不同的,兩者並不總是合在一起的,在這邊由於平台優勢與複雜度的關係,只談論Windows下的環境,Linux與Mac OS播放的環境方案選擇不多,一般也不用考慮設定的問題,相對來說,Windows就顯得複雜許多...

一般影片播放,需要經過解碼器的解碼,再透過播放器播放,播放器僅提供介面呈現、控制和後期調整,而解碼器則依照影片的編碼不同,往往需要相對應的解碼器來解碼,如果影片格式屬於封裝格式,像是avi、mp4、mkv之類的容器格式,則還需要分離器作資料分離的動作,自容器中分離出影像和聲音,再各自解碼,最終透過播放器播放,mkv還可封裝字幕,是相當方便的格式,需注意的是,有些影片的字幕是已經後製在影像上面,那是無法分離的

考量到商業授權的關係,一般建議使用的播放器,除了Windows內建的Windows Media Player之外,一般是推薦使用Media Player Classic和KMPlayer,Media Player Classic是由Gabest所開發,擁有與Windows Media Player 6.4幾乎相同的介面,因此常有人將兩者弄混,MPC已經開放原始碼經由GPL授權方式發佈,目前最新版本是6.4.9.1,也有基於MPC另外發展的Media Player Classic Homecinema,在MPC的基礎下增加EVR等新特性的支持,是習慣使用MPC和需要新功能的令一個選擇,至於KMP已經在許久前的文章介紹過,就不再介紹了

無論是MPC還是KMP,都提供了許多方便自訂的選項,可以供使用者選擇影像輸出的相關設定,而除了播放器,我們還需要解碼器,一般而言,MPC和KMP都內見了一定程度的解碼支持,已經可以勝任許多格式的播放,不過日常實際需求其實相當繁雜,顯然是需要一些額外支持,在這邊一般是推薦使用一些具有公信力且不錯評價的解碼組合包,像是K-Lite、完美解碼、終極解碼等等,注意有些播放器組合包含有大量廣告成份,誇大其功能和自許為開發商的無敵山寨... 這類東西就不要再用了,還有許多更好的選擇,自己選擇需要的解碼器各自安裝也是一種方法,只是往往步驟相當複雜,還需考量相容性的問題,而一般解碼包都會自行設定,可以省去許多麻煩,當然想要自行更換設定也是可以的,除了解碼包,ffdshow也是不錯的選擇,一個解碼器就能通吃許多格式,可以說是全能的解碼器,是相當棒的開源軟體,一般解碼包也會包含它,只是針對一些特定格式作其他的選擇,至於字幕,MPC和KMP內建自己的字幕引擎,一般是不需要外掛的字幕程式,附帶一提的是,K-Lite Codec Pack有Full、Standard、Corporate三種版本,Full支援最廣,Standard則是簡化的版本,Corporate則是以開源、免費解碼器為主的版本,K-Lite Mega Codec Pack則是Full版加上對Real Media格式的支援,一般建議安裝這個版本

再談色彩:

在解說軟體設定之前、必須先瞭解平面顯示器的分類,對於顯示器這方面可以說得太多... 一般需要先瞭解LCD面板的差異,畢竟這是目前最大的主流,由於技術性文章相當冗長,這裡提供一篇PCDVD整理的文章,各種面板解說文,對於絕大多數使用者而言,TN面板的佔有率是毋庸置疑的,畢竟它相當便宜,舉個簡單例子來說... 買同尺寸的液晶螢幕,可以直接說,價格差不多的同級液晶螢幕,"全部"都是TN面板,其他較好種類的面板,價格都落在一般TN面板的1.5倍到2倍以上,一般人是不會考慮的,往往直接的想法是同樣是液晶螢幕,尺寸也一樣,憑甚麼這麼貴... 其實這不單單僅是品牌的差異而已... 也因為市場競爭激烈,一般也只買得到TN面板的液晶顯示器

既然絕大多數是TN面板,那麼可以先瞭解,在TN面板下,顏色其實都是相當糟的,一般TN面板的可顯示色階是6bit,也就是2的6次方,因此實際上只有64級的灰階,與一般常用的8bit 256級色階是相差蠻多的,透過數位抖動(Dither)模擬缺少的顏色,勉強可以看起來接近8bit,一般顯示卡驅動程式也能提供一定的色彩強化,TN面板除了成本優勢之外,由於分子旋轉速度快,延遲時間可以很短,一般標榜著超低延遲的液晶螢幕,也大多為TN面板,液晶由於其特性,難以做到純黑的顯示,所以一般顯示黑色時,仍然會因為背光的關係,而看似黑灰色,這點在液晶電視上改進比較多,電腦螢幕相對就較差一點

以上談的是硬體上的差異,無法改變,那麼我們也只好在軟體設定上花多一點的心思,至少達到軟體上是最好的顏色輸出,切入重點,一般數位視頻的色域是YCbCr國際標準,與電腦的RGB色域有所差異,Y值代表著灰階度(亮度),CbCr則分別代表藍色和紅色的色差度,而灰階度換算到RGB範圍只有16-235,電腦標準範圍是0-255,因此一般影片在電腦螢幕上顯示會有偏白灰的現象,這是正常的,但是一般播放軟體預設設定,是以Overlay Mixer輸出,其顏色會在顯示卡中,先作16-235 -> 0-255的插值運算,雖然顏色不會偏白灰,卻又是另一個問題,傳統上,ATI與NVIDIA在Overlay的處理算法上有所不同,因此常有ATI顏色表現優於NVIDIA說法,實際上只是驅動程式的預設處理方式不同罷了,而Overlay Mixer實際上由於是顯卡處理顏色轉換動作,所以播放時擁有最好的效能,但也由於這個原因,Overlay的畫質其實難以掌握,也無法由軟體作後製,因此畫質無法改變,只能由驅動程式控制,剛提到顯卡會在內部作處理,實際上這個算法由廠商決定,處理方式也不同,ATI的顯示卡能有較好的顏色表現,而NVIDIA則顯得糟糕很多,甚至有色偏的現象,當然不同世代的顯示核心,可能會有不同的效果,但Overlay Mixer畢竟是相當老舊的技術,在時代趨勢下也面臨淘汰的命運,從微軟推出以DirectX實現視頻播放開始,由於擁有更好的擴充和支援,加上CPU運算能力的提昇,可以依賴CPU來做大部份的運算和後製,而到了高畫質時代,又由於影像的解析度大為提昇,資料流量相對龐大許多,低階和老舊的CPU處理上已經顯得相當吃力,則又開始了硬體加速的話題,顯示卡經由DXVA可以實現直接對視頻作解碼處理,再將結果經由DirectShow輸出,由於顯示卡的核心架構,其浮點運算能力是CPU難以比擬的,相當適合此類運算,這也是未來許多應用的趨勢,包含科學運算、物理模擬、影像處理、聲音處理等等,傳統上顯示卡只做3D處理的思維在未來已經不再適用,而相對於Overlay Mixer,在DirectX下則有VMR 7/9的輸出方式,詳情可以參考微軟對VMR的說明,一般設定上,如果顯示卡支援DirectX 9以上,建議是選擇VMR9輸出,會有最好的畫質

以VMR9輸出時,影像是以最接近原始畫質的方式呈現,也由於不會經過顯示卡的色域轉換,因此會有剛提到的顏色呈現上會有白灰的現象,因此需要透過軟體的修正,將16-235轉換至0-255,雖然意義上來說是一種失真,不過對視覺上是有比較好的效果,而色域轉換這個步驟,可以透過驅動程式或是DirectX 3D的Shader來實現,驅動程式來說,ATI應該已經預設會有這個動作,一般不用設定就能有正確的顏色輸出,而NVIDIA則需要一點步驟,首先是顯示卡驅動程式版本需要84.21以上,依照NVIDIA提供的技術說明:

1. Launch regedit and determine the current primary display card by looking in
HKey_Local_Machine\Hardware\DeviceMap\Video
and note the GUID (global unique identifier assigned by Windows), which is the long string in brackets { } at the end of the entry "\device\video0".
2. Look in
HKey_Local_Machine\SYSTEM\CurrentControlSet\Control\Video\{GUID}\0000
where {GUID} is the number derived from the previous step.
3. Open the "0000" directory and create a new DWORD called VMRCCCSStatus and give it a value of
0x3 - to force use of the standard YUV range of 16-235
0x1 - to force use of the extended YUV range of 0-255

這裡需要提的是,經測試設定為3才是正確的,上述最後的說明可能有誤,這裡提供一個簡單的登錄檔,更改其中的GUID值為自己所查到的值,複製至筆記本中,另存為.reg檔案執行套用就可以了:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{GUID}\0000]
"VMRCCCSStatus"=dword:00000003

以上的方式僅對XP有效,VISTA由於驅動程式架構不同,又預設使用新的EVR(Enhanced Video Renderer)輸出,相對於VMR9又是更新一代的技術,所以有點特殊,不過可以使用NVIDIA最新版的顯示卡驅動程式(177.xx以後),在驅動程式控制面板中,點選至 Video & Television > Adjust video color settings > With the NVIDIA setting > Advanced,就可以設定Dynamic range,由原本的Limited (16-235)改成Full (0-255)就完成了,此方法XP下也適用,這是最簡單的方式,使用新版驅動程式時,以上的登錄檔方式也會無效,也不再需要了



除了驅動程式支援之外,也可以選擇使用DirectX的Shader功能實現色階轉換,MPC已經內建此Shader函式,只需要在 Playback > Output 中設定使用VMR9 (renderless)並設定為3D surfaces就可以使用Shader功能,然後在播放影片時在滑鼠右鍵選單中選擇 Shaders > 16-235 -> 0-255 就完成了,如果無法使用或無效,請更新DirectX End-User Runtimes至最新的8月版

再談解析度:

由於液晶本身沒有顏色,也不發光,發光來自於背光模組,顏色來自3色濾光片,每個Pixel會有3個或4個液晶體,所以規格上來說,液晶本身畫質是不好的,不過由於每個Pixel相當小,因此我們很難發覺,也有一些技術就是針對液晶螢幕這個特性而產生,像是微軟的ClearType即是優化液晶顯示字體的技術,也由於液晶螢幕屬於每個Pixel固定大小的顯示器,所以解析度是固定的,像是15吋解析度一般是1024*768、17吋1280*1024、22吋1680*1050、24吋1920*1200,這些是由液晶本身的大小和點距決定的,是先天硬體的限制,無法改變,點距小的螢幕畫面自然就顯得細緻許多,像是有些22吋螢幕也開始使用1920*1200或是16:9的1920*1080的解析度,這就比一般螢幕細緻,也因為如此,在液晶螢幕上設定不屬於它的標準解析度時,實際上是用模擬的方式顯示,都會有一定程度的模糊,這是直接可以避免的... 如果只是需要字大一點,免得看起來吃力,可以藉由調整字體DPI來放大,不用改變解析度,一般是非常不建議使用液晶的非自身解析度,因為嚴重影響畫質

任何影像在電腦上也有屬於自己的解析度,一個Pixel對螢幕的一個Pixel,當我們需要改變它的大小時,同理也需要經過模擬運算,一般是Nearest neighbor、Bilinear和Bicubic三種方式
Nearest neighbor: 直接使用最鄰近的像素
Bilinear: 使用周圍2x2 4個相鄰像素做垂直和水平的線性內插
Bicubic: 使用周圍4x4 16個相鄰像素做內插,依照距離不同有不同權重,算法較複雜
Bicubic是其中最好的方式,同樣也可以在Resizer中設定,需要顯示卡支援Pixel Shader 2.0,一般支援DirectX 9.0就需要支援PS 2.0

不過此類運算都是一種模擬,因此最佳畫質仍然是建構在1:1的解析度下,由於電影多半是寬比例,播放時通常只會對到水平解析度,垂直會有黑邊,但只要影像能以原始解析度顯示在螢幕上就好了,黑邊通常可以拿來放字幕,既不影響畫面,也算是方便的應用

談硬體加速(DXVA):

DirectX Video Acceleration是微軟針對視頻播放提出的一種加速方案,隨著藍光電影的普及,Full HD畫質的影片逐漸成為流行,加上全新的H.264和VC-1編碼技術,用同樣體積的大小可以容納更好畫質的影片,用更高容量的藍光光碟,不僅可以容納FULL HD的全長影片,還能加上不失真、高動態的環繞音效,這些跨時代的技術並不是每個人都可以享受的,不僅是顯示器需要達到1080P的解析度,還要有相當高效能的電腦才有辦法順暢解碼這些高畫質影片,這在舊一點的CPU上是相當吃力的,因此需要顯示卡的超強浮點運算能力,透過PCI-E的高頻寬,使得顯示卡負擔高畫質視頻解碼變成可能,使用DXVA時,不僅需要顯示卡支援,在解碼器也需要相對應的支援,這也回到一個問題,就是硬體加速的影像,其畫質是由顯示卡處理決定,軟體可控制的選項並不多,加上要達到DXVA的條件限制相當嚴格,對H.264和VC-1的硬體加速更是如此,不過隨著硬體的進步,這問題逐漸會被忽略,由於新CPU的性能不斷被推進,直接使用軟體解碼,憑藉CPU的強力效能負擔所有處理,"硬吃"的暴力王道仍然逐漸會成為主流,由於可自訂性更高,對畫質的掌控更好,而且最輕鬆簡單,個人覺得軟解仍然是最好的畫質輸出方案,當然要電腦性能夠強...

我想不管是什麼使用者,希望在欣賞電影或是音樂時能享受到高畫質和高音質是必然的,只要不麻煩的話,我想絕大多數人都願意使用,但困難點就在於事實是很麻煩的,只因為一般方便的方案,都架構在最簡單、相容性最高、條件限制最少的環境下,就算瞭解軟體的調整有助於改善畫質,沒有好的硬體性能通常也是枉然,而膚淺的瞭解也往往造成錯誤的誤解,有時候並不是軟體的錯... 也不是使用者的錯...

文章中提到的設定,實際上只有一點點,主要是以MPC作說明,Vista建議使用MPC-HC,KMP也可以照例使用,唯獨對於Output中Surfaces的設定在KMP中會有錯誤的顯示畫質,建議使用預設的2D surfaces就好,原因不明... 或是直接使用品質模式

此篇文章絕大部分的解說在於觀念上的說明,這是最重要的,以下整理一下調整的示範和畫質比較



16-235

0-255


16-235

0-255


以上都是以VMR9 (renderless)輸出,Overlay Mixer則是色崩相當嚴重,亮度較暗,顏色也偏紅,因為沒辦法擷取圖片... 所以無法比較... 不過差異是相當明顯的,而判別色階是否有修正有個簡單的方法,以上例來說,倒數兩張黑色的部份,應該為全黑,一般電影後面的演員表部份的背景一般都是黑色,可以利用全螢幕播放時螢幕上下產生的黑邊與之作比較,0-255是看不見邊緣的,16-235則很明顯有黑色與黑灰色的分界,相當容易判別,白色亦然,推薦優先使用驅動程式支援的方式,若無效再使用Shader,MPC與KMP應該都有內建修正的Shader功能,若沒有,MPC可以在 View > Shader Editor 中手動添加:

sampler s0 : register(s0);
float4 p0 : register(c0);
float4 p1 : register(c1);

#define width (p0[0])
#define height (p0[1])
#define counter (p0[2])
#define clock (p0[3])
#define one_over_width (p1[0])
#define one_over_height (p1[1])

#define PI acos(-1)

#define Const_1 (16.0/255.0)
#define Const_2 (255.0/219.0)

float4 main(float2 tex : TEXCOORD0) : COLOR
{
return( ( tex2D( s0, tex ) - Const_1 ) * Const_2 );
}

KMP選擇品質模式預設就會強制使用RGB模式輸出,不需再使用Shader轉換,當然也可以自行在 視訊 (進階) > VMR9像素著色器 > 編輯 中新增以上的代碼,再套用此Shader,不過說到這... 千萬不要在驅動中設定了色域轉換,又使用Shader... 顏色一轉再轉也只是更偏而已,KMP的RGB模式也是同理,同時只要選擇一種轉換方式並轉換一次就好

1 comments:

Anonymous said...

Who knows where to download XRumer 5.0 Palladium?
Help, please. All recommend this program to effectively advertise on the Internet, this is the best program!