被壓縮的視覺:影片編解碼技術
文 | 何鳴 網易雲信音影片演算法工程師
導讀:視覺是人類獲得資訊的主要方式,每天有大量的影片資訊被生產並傳輸。未經壓縮的影片內容佔用的存儲空間和傳輸頻寬十分巨大,以常見的30fps高清影片為例,採用avi格式存儲的YUV420影片流一分鐘就有2GB大小,傳輸頻寬需要40MB/s。所以我們日常從手機和電腦等電子設備上獲得的影片資訊都是被壓縮後再傳輸和存儲的,壓縮這些影片資訊的技術便稱為影片編解碼技術。
1. 顏色空間
我們人眼的視覺資訊是由視桿細胞和視錐細胞獲得的。視桿細胞主要感受光線的明暗變化,獲取視覺的亮度資訊,而視錐細胞可以感受到顏色。根據仿生的原理,電腦採集影片訊號也採用亮度資訊和速度資訊分別採集的方式。由於人眼的視桿細胞數量比視錐細胞的數量多很多,所以人眼對於亮度資訊更加敏感,所以在採集影片資訊時,常採用YUV420的格式採集。具體操作如圖1中所示,四個亮度像素Y共用一組紅色和藍色的色度像素。
採集來的像素在電腦內部都採用2進位的形式存儲,為了表示人眼視覺的顏色空間,在電腦內部一般採用256色存儲,即亮度資訊和色度資訊的取值範圍都是0到255。通過不同的數值組合可以表示出不同的顏色,例如,YUV都是255時是粉色,YUV都是0時是深綠色。這樣為了表示一個像素需要1.5位元組的數據,而一幅影像中有成千上萬個像素。一幅720p解析度的影片包含92萬個像素,一幅1080p解析度的影片包含207萬個像素,而一秒鐘的影片包含30幀影像。對於數據量巨大的YUV影片數據,需要壓縮後才能存儲與傳輸。
2. 壓縮原理
壓縮影片資訊與壓縮文件資訊不同,在影片中存在著大量的冗餘資訊。如圖2所示,相鄰幀之間的相似性會有時間上的冗餘,同一幀的相鄰塊之間存在著空間上的冗餘,由於人眼感知對於低頻資訊更敏感,所以存在著感知上的冗餘。
影片壓縮的基本原理就是去除這些冗餘資訊,將影片壓縮300到500倍,常見的壓縮方法有預測編碼、變換編碼和熵編碼技術。如圖3所示,將輸入的影片資訊按照各個編碼模組進行處理,輸出碼流的過程稱為影片編碼過程,再通過對應的熵解碼、變換解碼和預測解碼過程,將碼流還原成YUV420影片流的過程稱為影片解碼過程。可以將影片編解碼的過程看作是壓縮和解壓縮的過程,但在該過程中,由於壓縮的演算法有所差異,所以解碼的演算法必須對應著編碼的演算法,不同的編解碼演算法稱為影片標準。
現在常用的影片標準,例如H.26x系列標準,其中最常用的是H.264標準,由於開源編碼器x264的普及,也將這代標準稱為x264標準。H.26x系列標準的研發與進展一直是行業的標杆,最新的H.266/VVC標準加入許多新技術,而這些技術可以簡單概括為以下幾個方面:
塊劃分技術:除深度學習技術外,傳統的影片編解碼技術都是按塊去處理影片,而且趨勢是最大塊越來越大,最小塊越來越小,塊的類型越來越多。對於相對靜止的區域,採用大塊可以提高壓縮效率,使用一兩個標誌位或者很少的殘差數據就可以表示一個大塊,可以極大的壓縮影片畫面。對於運動比較多的區域,採用小塊可以提高畫質品質,將運動的細節更完整的表示出來。為了更精細的劃分運動和靜止的區域,塊劃分技術採用各種形狀的矩形塊代替原有的方形塊劃分。在工程落地方面,越來越複雜的塊劃分技術浪費大量的計算資源,所以很多快速演算法都是針對塊劃分模式進行預測,將機器學習演算法和深度學習演算法應用到塊劃分預測過程中,可以在品質損失微乎其微的情況下,快速得出塊劃分模式。
幀內預測:幀內預測屬於預測編碼的範疇,在影片序列中,有一些幀和塊的預測資訊無法從參考幀中獲得,這樣的幀被稱為I幀或幀內預測塊。在I幀中所有的塊都是幀內預測塊,而幀內預測塊可以存在於I幀或P幀和B幀中。具體怎麼實現幀內預測呢,對於一個幀內預測塊,首先在該塊周圍補償出一圈像素(對於邊緣部分,可以採用擴邊的方式),根據這圈像素值,採用角度預測或者平面預測的方式補償出當前塊,再通過與原圖比較,選擇損失最小的預測模式。由於幀內預測補償時採用的像素值都來自於當前幀,不需要參考幀資訊,所以幀內預測常用於序列首幀或者影片資訊變化比較大的區域。
幀間預測:與幀內預測相對應的是幀間預測技術,他們同屬於預測編碼技術。幀間預測的參考影像資訊來自於參考幀,所以在影片首幀或者參考幀缺失的情況下不能使用幀間預測技術。幀間預測的關鍵過程便是運動搜索與運動補償過程。運動搜索過程負責搜索出參考幀上最接近當前塊的影像塊,並生成運動矢量,運動補償則根據參考幀資訊生成當前幀資訊。根據最新的幀間預測技術,運動資訊可以包含平移、縮放和旋轉。由於運動矢量指向的位置未必是整數像素的位置,所以在運動補償過程中還涉及到亞像素補償技術。通過幀間預測可以極大提高影片的壓縮率,例如在參考幀中有著相似度很高的塊,則可以對當前塊採用skip的模式編碼,僅需一個標誌位即可編碼原有塊內所有的YUV資訊。
變換量化:變換與量化技術是配套使用的,在剛剛的分析中,由於人眼對於高頻資訊的不敏感,需要對高頻資訊進行壓縮,在頻域更容易對其進行操作,所以需要對影像進行變換。常用的變換方式有哈達瑪、整數DCT和整數DST,由於有預測編碼技術的存在,所以變換通常在殘差資訊上操作,根據不同的壓縮率要求,可以對變換後的係數進行量化,僅保留人眼更敏感的低頻資訊。在解碼過程中,需要配套的反量化和反變換技術,將壓縮後的殘差係數還原出來。
熵編碼:對於標誌位和殘差係數,還需要一套編碼技術進一步壓縮這些資訊,對於一些關鍵資訊,可以採用指數哥倫布,遊程編碼等方式壓縮,對於大量的殘差係數和影像幀內的編碼資訊,現在常用基於上下文模型的熵編碼技術進行壓縮。熵編碼的基本原理是對小概率符號使用更多比特編碼,而大概率符號則採用較少的比特編碼,通過上下文模型,大部分的大概率符號都可以被壓縮。區別於預測編碼和變換量化過程,熵編碼過程是無損的。
環路濾波:對於參考幀來說,由於後續的影片都是依據前面影片幀的資訊補償出來,所以參考幀中出現的損失和錯誤,會延續到整個序列,隨著運動補償的過程,或擴散到整個影片幀當中。為了降低影片的損失,在每一幀編碼完之後,都會對其進行後處理,處理這些影片幀的濾波器被稱為環路濾波器,使其更加接近於原始影片序列。現階段,許多基於深度學習的後處理技術被應用到環路濾波器當中,在編解碼過程中起到很好的效果。
除了以上技術,在工程化落地過程中,碼控技術、並行技術、指令集技術同樣影響編碼器效果。影片編解碼技術包含著一系列演算法的技術集成,將這些技術組合使用,形成各類影片編解碼標準。除H.26x影片標準之外,還存在著開放影片標準聯盟的AV1標準,國產的AVS標準等。
3. 影片編碼技術的挑戰與發展
根據現在的技術需求,未來的影片編碼技術需要面對更高解析度、更高幀率、更廣色域及HDR影片的挑戰。同時,面對更多形式的影片內容,例如全景影片、點雲、深度學習特徵圖等,影片編碼技術需要與時俱進,不斷發展。現有技術方興未艾,未來技術仍然可期。