由 Google 所領導的影像 codec:VP8,想要靠著與 HTML5 的整合,以及對手機、平板電腦等,運算能力較低的手持裝置最佳化,提供無專利問題的解決方案,來挑戰H.264龍頭霸主的地位。
目前影像codec(編碼、解碼器)仍以H.264為主流規格,無論手機、平板電腦,或是YouTube,甚至是藍光影片光碟,都將H.264列入支援清單,儼然成為當代影像codec霸主。
在2012年3月舉辦的MWC(Mobile World Congress,世界移動通訊大會)中,Qualcomm展示了下一代影像codec H.265,它的代號是HEVC(High Effciency Video Codec,高效率影像編碼解碼器),從名字上聽起來比代號為AVC(Advance Video Codec,先進影像編碼解碼器)的H.264還要威猛。
不過這項技術目前還在發展階段,第1版的委員會版草案於2012年2月才剛拍板定案,依據其發展規劃,最終版本的國際版草案預定於2013年1月制定,至於推出正式版則沒有明確的時間表,H.264似乎還有一段長路要走。
影像技術大事紀 | 年份 | VP8大事紀 |
Louis Le Prince展示人類史上第一部電影 | 1888 | |
1992 | On2 Technologies公司成立 | |
發表MPEG-1 | 1993 | |
MPEG-2發表,DVD問市 | 1995 | 首款編碼器TrueMotion S發表 |
MPEG-4發表 | 1998 | Google成立 |
MPEG-4 Part10(H.264)發表 | 2000 | TrueMotion VP3發表,隨後改以VP做為系列名稱 |
2005 | VP7發表,並獲Skype採用 | |
HD DVD、藍光光碟問市 | 2006 | |
中國藍光高清光碟(CBHD)標準發表 | 2007 | |
HD DVD退出市場 | 2008 | VP8發表 |
YouTube提供1080p影片服務 | 2009 | |
2010 | Google收購On2 Technologies | |
2011 | VP8函數庫libvpx發表 | |
H.265第一版草案發表 | 2012 | 正式版libvpx發表 |
但在H.265正式登場之前的這段空窗期,H.264可能要面臨一項新的挑戰。由Google所領導的影像codec:VP8,想要靠著與HTML5的整合,以及對手機、平板電腦等,運算能力較低的手持裝置最佳化,提供無專利問題的解決方案,來挑戰H.264龍頭霸主的地位。VP8 最早由On2 Technologiesis開發,於2008年9月13日首度釋出,其目地在於取代自家上一代產品VP7。不過Google在2010年收購On2 Technologiesis,這項技術便轉為Google所有。
這一連串發展的轉捩點在2010年3月12日,自由軟體基金會(Free Software Foundation)發表了一封公開信,呼籲Google使用HTML5和VP8,取代Adobe Flash Player和H.264,成為YouTube使用的影片格式。
在聽到了自由軟體基金會的聲音後,Google於同年5月19日釋出免費的VP8 codec函數庫libvpx,經過數次改版後,libvpx終於在2012年1月27發佈第1個穩定版本1.0.0版。至於解碼方面,除了可以使用libvpx進行軟體解碼外,WebM專案的硬體小組也設計了VP8的硬體解碼器,無償提供給晶片廠商使用。
在影片封裝容器方面,Google制定了專屬的影片容器:WebM,它以Matroska(MKV)封裝格式為基礎,並搭配Vorbis音訊(Ogg使用的編碼方式),這樣好處是所有技術都是免費、自由的,不會產生專利權或權利金等問題。
最初在制定VP8標準時,其功能設計的焦點就在網路應用上,由於網路的頻寬將成為品質的一大限制,因此VP8選擇了頻寬先決的開發方向,以較低的品質來彌補頻寬的不足。
VP8的設計重心放在尖峰訊噪比(Peak Signal to Noise Ratio,PSNR)為30dB至45dB之間的表現,根據Google所釋出的官方文件,在這個尖峰訊噪比區間的影像品質,大約在「尚堪入目」(watchable)到「目視無損」(visually lossless)之間。
由於人的眼睛對亮度比較敏感,對彩度比較遲鈍,因此在處理影像的時候,往往會減少對色彩抽樣的數量,以節省儲存空間。YUV的色彩格式是將顏色分為3種分量,以Y表示亮度(Luma),U、V表示色度(Chroma),並可透過公式轉換成RGB色彩格式。
最基本的YUV取樣方式就是對所有像素皆進行取樣,這種方式稱為YUV 4:4:4,名稱中的3個數字分別表示U、V分量的水平寬度參考值、第1行取樣數目、第2行取樣數目。如果是YUV 4:2:2的話,代表在寬度為4個像素的區塊中,只取2個取樣,每個2 x 1像素區塊共用一個色度取樣,而YUV 4:2:0則是更進一步精簡掉第2行的取樣,讓2 x 2像素區塊共用一個色度取樣。
▲以4 x 4的像素區塊為例,無論使用哪種方法,亮度都會採集16個取樣。在色度方面,YUV 4:4:4也是採集16個取樣,YUV 4:2:2、YUV 4:2:0則是分別將取樣數降低至8個、4個。
從圖中可以清處看到,YUV 4:2:0可以把色度取樣數從16縮減至4,原本相較於YUV 4:4:4需要對4 x 4像素區塊進行3種分量共48個取樣,YUV 4:2:0只需24個取樣(16+4+4),可以節省一半的資料空間。
如果將網路應用的平台拉到手機或平版電腦等,效能相對薄弱的手持終端裝置上的話,除了會面臨資料流量的問題,也得盡量節省解碼時所需要耗費的硬體資源。VP8可以將經過熵編碼(entropy encode)處理的資料,切割成許多可平行處理的區塊,只要在編碼時付出些微的效能衝擊,就能夠讓多核心處理器,在解碼時發揮多工優勢,並確保單核心處理器的效能,不會因此受到影響。
VP8除了更貼近低頻寬網路,也沒有冷落了高階應用。VP8在制定規格時,將色彩取樣定為8-bit YUV 4:2:0,採用循序(progressive)掃瞄,並將解析度上限定為16383 x 16383,VP8也希望能夠藉由其高效率的解碼能力,以及能屈能伸的編碼彈性,讓手持裝置到效能強大的桌上型電腦一體適用。不過VP8卻有個矛盾的地方,它不具有類似H.264的範本(profile)設計。
範本的用意是針對不同的播放設備,制定其效能足以負擔的編碼設定,如果播放設備性能較弱,可能就要犧牲壓縮效率(如降低品質)以求得播放流暢。廠商在規劃產品時,就可以依據效能表現,限制該產品所支援的範本,明確地區隔出能流暢播放的檔案。希望能在網路平台及手持裝置一展長才的VP8,反倒不具有這項功能,讓人覺得有些怪異。
Google WebP 圖片新進展:無失真壓縮、去背透明、動畫
(後面還有:VP8的3大特色)
VP8與H.264壓縮影片的概念大致相同,但是在實際處理的過程中,還是有不同的地方。筆者將VP8獨有技術,選出3個比較有特色的部份,分別是2階段轉換、畫格內預測、畫格間預測,以下分別向讀者說明。
常見的影像編碼格式,會在色彩取樣完畢之後,將畫面切割為許多16 x 16像素的巨區塊(macroblock),並對這些巨區塊進行離散餘弦轉換(discrete cosine transform,DCT),利用DCT的數學特性,將資料分布集中於低頻區域,之後再對轉換後的資料進行量化(quantization ),以節省空間
VP8則是會先將每個巨區塊,再細切為16個4 x 4像素的小區塊,先對小區塊個別進行DCT後,再將得到的16組參數進行阿達馬轉換(Walsh–Hadamard transform,WHT),透過WHT轉換,可以更進一步刪去資料重複的部分,節省儲存空間。
▲一般編碼器是直接對16 x 16的巨區塊進行DCT,VP8則是先將巨區塊切成16個小區塊,先進行DCT後,再將巨區塊進行WHT。
VP8在分析畫面色彩的時候,會將畫面切割為許多子區塊(VP8允許4 x 4、16 x 16大小亮度子區塊,和8 x 8色度子區塊),分析該像素的亮度、色度與鄰近像素的關係,並建立延伸的預測矩陣(請參考圖中淺綠色部分),透過重複利用預測矩陣中的參考值,以縮減資料量。
若以4 x 4區塊為例,圖中白色部分就是區塊中的16個像素資料,H_PRED(horizontal prediction)、V_PRED(vertical prediction)分別是將被分析的單一像素,套入左邊或上面的參考值,比如X00的H_PRED為L0,X32的V_PRED為A2。DC _PRED(DC prediction)則是套入左邊加上面參考值的平均,X12的參考值即為L1 + A2的平均。
最後一個比較特別的方法是TM_PRED(TrueMotion prediction),它是將整個區塊加上一個補償參考值C,並透過以下公式計算Xij=Li + Aj – C,以X12為例,其參考值即為L1 + A2 – C。根據官方提供的資料,使用這些方式可以節省20 ~ 45%的資料流量。
VP8捨棄了以往H.264及其他編碼常用的I、P、B frame動態預測畫格,改用最後畫格(last frame)、黃金畫格(golden frame)、備用畫格(alternate frame),但是2種方式的概念、原理並沒有相差太多。
最後畫格說穿了就是和I frame一樣,將整個畫面完整地記錄下來,雖然會花費最多儲存空間,但是只要解碼單一畫格,就可以顯示該時間點的完整畫面。
黃金畫格則是類似P frame的概念,只記錄與上一幀相異的部份,至於相同的部份,則延用上一幀的資料。黃金畫格除了可以節省資料流量外,對於即時編碼(比如視訊聊天)也有很大的用處,它可以透過動態補償的方式,即時修復畫面中的錯誤,而不用重新傳送1張全新的畫面。
▲在預測矩陣中的元素A、L、C,都是由編碼器依照矩陣中像素的分佈,經過計算產生的參考值,可以透過「複製、貼上」、公式計算的方式,將資料填入實際畫面中。
▲以此圖為例,若X的預測方式處理為DC_PRED的話,X=(A1+L1)/2,若為TM_PRED的話,X=A1+L1-C。若Y的預測方式為H_PRED的話,Y=L3,若為V_PRED的話,Y=A3。
備用畫格是VP8獨有的技術,它最大的特色就是畫格中的物件不一定要顯示在畫面上,而且可以將其中物件插入不同畫格中,說得具體一點,它的用途是用來取代傳統的B frame。
B frame的運作的方式和P frame很相近,不同的是B frame可以比對上、下一幀畫格,從2個畫格擷取畫面中的物件進行動態補償,然而P frame只能從上一幀畫格做動態補償。
備用畫格可以把許多將被用於動態補償的物件,收集在單一畫格中,並且在解碼時分配給多個黃金畫格使用,以增進壓縮的效率。由於備用畫格的傳輸、解碼與其他畫格並無不同,所以不會造成處理器額外的負擔,頂多是因緩衝的需求(暫存畫格中物件),額外佔用些微記憶體,很適合用於低階硬體。
▲圖中I、B、P分別指I、P、B frame,L、G、A表示最後、黃金、備用畫格,紅色箭頭表示可以讀取其他畫格資料的方向。黃金畫格也能和B frame一樣,可以向2個方向讀取資料。
動態補償除了要記錄相同的物件外,也要記錄物件的移動方向(動態補償向量),透過VP8的SPLITMV技術,如果某一區塊的動態補償向量與鄰近區塊相同時,編碼器只需標記要延用上方或是左方的數值,不需記錄完整資料。
VP8和其他的影像編碼器一樣,會將畫面分為數個16 x 16像素的巨區塊,並以巨區塊做為影像處理的基本單位,即使分析色彩時可以再細切為4 x 4、8 x 8的子區塊,但最終還是會組合成16 x 16巨區塊。在壓製品質比較差的影片中,常常會看到形似馬賽克的塊狀雜訊,就是巨區塊架構的後疑症。
▲假設一個4 x 4的區塊具有3種動態補償向量,其分佈如圖所示,在未經SPLITMV處理前,編碼器需記錄16組資料,但是經過處理後,只需記錄3組資料,其他13組則參考鄰近區塊即可。
一般編碼器會透過迴路濾波器(loop filter)來減低這種塊狀雜訊,不過對於單一畫面,只能使用相同濾波強度。VP8的可變式迴路濾波器(adaptive loop filter)可以針對畫面中不同的區域套用不同濾波強度,而且能夠在每幀之間調整強度,如此一來既可以消除塊狀雜訊,也可以減緩整體畫面變模糊的情況。
▲筆者以遊戲畫面來說明可變式迴路濾波器的概念。圖中前景人物(玩家角色)即為變動多的部分,可以增加濾波器的強度,背景人物(路人)變動的幅度比較小,可以降低濾波器強度,因為場景沒有變動,不需使用濾波器。
筆者以libvpx及x264編碼器,分別進行VP8、H.264的轉檔測試,轉檔條件為將片長為2分鐘的1080p預告片,以固定品質(CRF參數=20)的方式,轉成解析度為960 x 544,不附帶音訊的影片。
測試平台搭配的是Core2 Duo E6550處理器,從下方數據可以看到,除了編碼時間之外,2者的表現十分接近,無論在播放時的處理器佔用率,以及壓縮率的方面,表現幾乎一模一樣。如果libvpx可以在往後的更新加強效率的話,實用性或許可以和H.264並駕齊驅。
(點圖可放大)
▲libvpx及x264都是收錄於ffmpeg的編碼器,在表現上只有編碼效率有著比較大的差異。由於測試時是採固定品質方式編碼,所以資訊流量會不段變動,因此採用整體流量除以片長的方式,計算其平均流量。
以目前的局勢來看,足以左右勝負的「枱面下內容」,仍然以RMVB、H.264等格式為主,這將成為WebM想要一統江山最大的阻礙。筆者認為要說服他們轉向WebM,最重要的關鍵還是在於編碼器,該如何強化libvpx的表現,甚至推出品質可靠的圖形介面轉檔程式,將是VP8當前最重要的課題。