文 | 何鳴 網易雲信音視頻算法工程師
導讀:視覺是人類獲得信息的主要方式,每天有大量的視頻信息被生產並傳輸。未經壓縮的視頻內容占用的存儲空間和傳輸帶寬十分巨大,以常見的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視頻的挑戰。同時,面對更多形式的視頻內容,例如全景視頻、點雲、深度學習特征圖等,視頻編碼技術需要與時俱進,不斷發展。現有技術方興未艾,未來技術仍然可期。