1. 程式人生 > >被壓縮的視覺:視訊編解碼技術

被壓縮的視覺:視訊編解碼技術

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