1. 程式人生 > >下一代開放視訊編碼標準AV1(轉自搜狐)

下一代開放視訊編碼標準AV1(轉自搜狐)



本文整理自RTC大會,陳悅的演講《下一代開放視訊編碼標準AV1》。

陳悅

谷歌 Chrome Media 視訊編碼軟體工程師

負責開發新一代開源視訊壓縮演算法AV1。清華電子本科,加州大學聖塔芭芭拉分校電子與計算機工程博士。研究方向為視訊編碼和通訊。

在講AV細節之前,我先講一講為什麼google要去做開源的視訊編碼器。歷史上來講,二十年前,視訊業務很侷限,基本只存在於電視廣播、DVD等,所以視訊壓縮標準比較單一化。但是現在大家知道在網際網路時代,頻寬、各種網路條件的一直變好,所以視訊方面應用變得越來越多。隨著視訊業務在網際網路上面的多元化,近幾年各種應用都呈現井噴的趨勢,所以提供視訊應用的公司或者提供者,他們的背景、需求變得越來越不一樣。有的人希望編碼器就是要穩定、單一、標準化。有的人希望編碼器可以很快的適應他們應用的需求。也有人希望編碼器免費。這就是為什麼google覺得在單一的國際化標準之外,市場還需要一些多元化產品。

第二,google一直以來有一個信念,網際網路應用的基礎技術應該是免費的、開放的。舉個例子,除了編碼器以外,Chrome是免費的,Android系統是免費的,Google一直在做這樣開源的事,不想從基礎應用上賺錢。具體到編碼器,因為是免費的,我們不需要花費時間去討論關於授權費、使用費以及收益分割的時間等問題,所以這個產品的迭代更新會非常快。

在2013年6月,我們釋出了一個編碼器——VP9。首先,VP9是免費的。其次,將最好的H.264和最好的VP9比,VP9的效能有40%到50%的提升,效能是指位元速率的減少。VP9在更快的適應市場,VP9支援除了8位元以外更高的畫素精度,比如10位元和12位元的視訊內容。除了支援最基礎的YUV420格式以外,還支援其他的YUV格式,比如YUV 444,它經常被應用在電視上。

接下來講一講市場,現在有數十億的終端支援VP9的解碼。具體到產品上,瀏覽器方面,Chrome、Firefox、Edge、Opera都支援VP9,手機方Android4.4(Kk)以上的版本也是支援VP9解碼。另外,在一些家庭娛樂設施上,比如電視,尤其是超高清的4K電視,以及電視盒子、電視棒、遊戲機上,VP9也有廣泛的支援。

VP9現在在美國市場上的第一個使用者,也是現在最大的使用者就是youtube,google的視訊分享網站。在VP9被投入使用的第一年,youtube上用VP9編碼的視訊總共播放時長是25億個小時。到現在為止,每天youtube的使用者會看20億次的基於VP9編碼的視訊。所以除了給youtube每年省下很大數額的頻寬費用之外,它給youtube業務也帶來很多好處,比如說延遲的問題,引入了VP9後延遲減少了15%。緩衝的效能,在發達國家提高了25%,在發展中國家提高了100%。在高清內容播放上,發展中的市場,高清內容的播放時間也被提高了25%。

上面這張圖,顏色越深,代表在Youtube上,VP9的播放時間比H.264越多。

另外除了youtube之外的應用,除了視訊點播這塊,youtube大部分的直播、Google Play的電視和直播,Netflix的直播也基於VP9。但是,在實時通訊領域,VP9做的還不夠,與Youtube的點播業務佔主導有關。

接下來,開始講AV1。先講一下AV1的背景,做AV1的組織叫Alliance for Open Media,開放視訊聯盟。大概是從2015年9月份開始做AV1。AV1從字面上來說,就是AOMedia聯盟做的第一代視訊編碼器。AV1董事會對AV1的定義和期待是,AV1是一個開放的、協同開發的編碼器。另外它是適應網際網路和不同的裝置,經過頻寬優化的編碼器,並且在解碼的時候複雜度需要比較低。還有就是因為需要產業化,所以AV1必須很快成為穩定、高效的、實時解碼的編碼器。

這是AOMedia聯盟的主要成員,一共有32家,上圖沒有全部列出。分兩個陣營,第一個陣營是有視訊服務的IT公司,比如google、Netflix,另外一個陣營是傳統做半導體、晶片的公司,比如一直在跟進我們的有NVIDIA、ARM、Intel等等。

AV1具體的目標是,與VP9和HEVE相比,位元速率需要大幅度降低,目標是減少30%左右。解碼是比較低的複雜度,目標大概是VP9的兩倍。另外AV1也做了很多對螢幕圖象內容的優化,比如說我們做了調色盤。在開發的時候,各個公司會提出不同的新的演算法加到這裡面,新的演算法必須可以跟其他的演算法能夠協同一起相容的。

AV1最開始做的時候是把好幾個開源視訊編碼器裡面的優秀演算法給整合到了一起,演算法主要取自於VP9和VP9的優化版本,另外也有Mozilla和Cisco的一些演算法。每次我們提交一個新的演算法,首先我們會與AV1的硬體工作組溝通,看硬體商可不可以實現。接下來,演算法會交到主要的工作組去稽核,由這個組決定要不要採納這個新演算法。另外也有測試組去測效能提升情況。所有新演算法都會經過智慧財產權組的稽核。現在,好幾十個新的演算法已經被加到AV1裡面,較VP9效能也是的高了很大的提升。

在市場方面,youtube會在第一時間使用AV1,它會是第一個使用者。Netflix也表示會盡早使用AV1。AV1工作組近期也一直在開發測試工具以及軟體的優化,這樣可以更快的推進AV1的產業化。

現在是技術細節。我大概簡略講一講AV1的新演算法,包括:預測演算法、變換演算法、後處理圖象修復演算法等。

先講一講AV1的預測塊是怎麼分的。VP9和HEVC的分塊方法都是從64x64的塊開始分,在每個節點上,有4種分法,最小的分到到4x4。因為想對超高清視訊有更好的支援,所以AV1是從128x128開始分,每個節點的分塊方法增加到十種,除了原來四種,加了四個T字型和兩個細分的窄條分法。做視訊硬體特別討厭小塊的東西,所以在VP9的時候,硬體廠商覺得如果分的太小的,在快取相鄰塊的資訊時,以及做小的變換的時候,硬體會很累,所以VP9其實對小於8x8的塊是做了很多模式選擇的限制,比如一個8x8如果分成4個4x4,這些4x4的塊必須用同一個參考幀,同時要用幀內預測或者幀間預測。AV1現在小於8乘8的塊可以靈活的選擇變換模式和預測模式,這個帶來的好處是大幅度的效能提升,程式碼庫變得非常簡單,維護起來也變得非常簡單。因為這個變化我們刪掉了十萬行程式碼。

接著,講一講參考幀的結構。VP9編解碼器可以快取8個參考幀,對當前幀,可以從8個參考幀裡選3個出來,具體到每個小塊可以從三個幀當中選擇一幀或者兩幀做參考。選完幀之後,可以對每一個幀去指定一個運動向量,如果它是選擇兩幀,最後的預測塊會是兩個普通預測塊的平均值。

幀內預測, VP9支援基於8個方向的外插值。AV1是基於原來的8個方向,中間加了一些delta,現在有56個方向。

除了基於一定方向的插值之外,AV1也支援從參考象素的相對位置處,選一個最精確的象素直接copy過來。

調色盤模式是專門針對螢幕影象內容做的。會先傳一個調色盤過去,調色盤裡面大概有7、8個顏色,在幀內預測時所有的象素都從這7、8個顏色裡選。我們在傳調色盤的時候基於相鄰塊和之前的顏色做的差分編碼。與之前標準不同的是,AV1的調色盤模式是附加在幀內預測,它不受編碼器的引數控制的。

這是Mozilla的提案,中心思想是AV1可以從量度的塊直接預測出色度的塊,預測模型是引數化的,所以在編碼器會把引數搜尋出來直接傳給解碼器。

這是幀間預測,講一下參考幀的變化。AV1還是快取8個參考幀,但是當前幀可以用到裡面的7幀。

參考幀之外說一下運動向量。VP9在做運動向量預測時,當前的塊之外,會在上面和左右在掃一層,也就是它的鄰居,把它鄰居的運動向量也會加到參考列表裡面,兩個參考向量。掃的方法是固定的,誰先掃到誰先進去。

AV1做的時候是這樣,首先是參考列表可以支援4個參考向量,編碼的時候會根據列表長度自適應。在建立參考列表時,掃完之後會根據概率模型,把概率比較高的往前面放。這是AV1的運動向量的預測演算法。

如果是做雙幀預測,並不會簡單的把兩個列表給拼起來。現在就講一講我們怎麼去做雙幀預測。VP9就是拿兩個預測塊做一下平均。AV1不會再做平均了,另外它支援做傳統的雙幀預測,兩個都是幀間預測;也可以支援聯合幀間和幀內預測。

這就是大概的流程,左邊是根據傳過來的兩個預測模式生成兩個預測塊,P1、P2。我們加一個根據位置設的濾波器,在每個位置上P1、P2會有兩個不同的權重。雙幀幀間預測和聯合幀間幀內預測都會用到。

首先說一下雙幀幀間預測。它更適合圖形分割不同的物體在一個塊裡面的情況。如果P1和P2在某個位置上差值比較大,我們在做權重的時候,會傾向於有一個P1或P2佔比較多的權重,值會比較接近其中某一個值,如果它們差不多我們就做比較平滑的濾波。這樣就整個塊不會被平滑的太厲害。

這是基於幾何分割的雙幀預測。基於矩形分割的編碼器,一般都沒有辦法很好的去處理物體的邊緣。AV1支援把普通的矩形預測塊分成兩個先行塊,每個塊去應用一個預測方法。把邊緣做了平滑濾波,把兩個邊緣的部分兩個預測塊給平滑的結合在一起。

這是我們給幾何分割做半平滑濾波時,會用到的lookup table。這些都是64x64的塊,根據圖象大小以及分割在哪裡,AV1可以很快的找到權重二維矩陣。

基本上來講,對基本不同塊的大小,我們支援大概32個分割的方法。

聯合的幀內幀間預測,做它的目的是離上面的塊和左邊的塊比較近的象素,它其實可以從上面塊和左邊的塊得到很好的預測,不是非得用幀間預測。這就是為什麼聯合的預測方法結合了比較普通的幀間預測塊和四種比較常見的高頻幀內預測方法。

除了普通的一塊一塊的預測之外,還會做塊間交疊的運動補償。普通做法是每塊傳1-2個向量,這個塊的預測就基於這1-2個向量。AV1除了基於這1-2個向量,還會基於周圍塊的運動向量,生成各種不同版本的預測,在離塊比較近的地方做平滑濾波,這樣就能更大限度的很好利用整個幀的運動向量場。

再講一下基於仿射變換的運動補償。現狀視訊質量越來越高,如果直接用二維表示運動向量很困難,也不準,最後的結果是中間塊化效應會非常強。在AV1裡面,我們提出了兩種解決方案,一種是算全域性的仿射變換的模型,直接傳給解碼器。另一種是自適應的去預測仿射變換模型,用於區域性。

在我們知道這個模型之後,AV1是怎麼去做這個變換呢。傳統的仿射變換是一個3x3、自由度為8的矩陣。這樣的結果就是,由於編碼器是由一個塊一個塊做,所以,面向一個自由度特別高的矩陣,每一個畫素最後被投射到的地方分佈會很不規則,做向量化、硬體優化很困難。

AV1的方案是限制自由度變為 4,只支援平移、旋轉、zoom in、zoom out,並且旋轉、zoom in、zoom out也做了一些限制。AV1所有仿射變化都會被分解成兩步,很容易向量化。第一步是水平拉伸,第二步是垂直拉伸,通過這兩步可以很容易的把一個正方形變成一個璇轉過的平行四邊形。

現在講一講變換。首先是VP9支援的是離散餘弦變換,在劃分變換塊的時是網格型的。AV1是自由劃分,有比較好的適應特性。

DCD顯然對於視訊編碼不夠,所以我們還加入了ADST,非對稱的離散正弦變換。它一開始是用在幀內預測上面,因為幀內預測是頭上小後面大,AV1支援16種二維變換,每個維度是DCT、ADST、反過來的ADST和IDTX(不做變換)。IDTX是對螢幕影象內容效果特別好。VP9只支援正方形的變換,AV1支援了一些長方形的變換。

再講一下圖象恢復。在傳統的編碼器裡面就是去塊化效應的濾波器。上圖就是整個流程。VP9中,整個幀都能用同一個塊化濾波器的level,level是指要更平滑還是多保留一些高頻向量。AV1的話,每個顏色的空間的level都是不一樣的。另外,每個128x128的塊的level也是不一樣的。

最後就是一些小東西,熵編碼, AV1開發複雜低,是基於CDF的熵編碼。在做量化的時候,AV1也支援幀內可變的量化矩陣,以及幀內可變的量化極數。我們也做並行的功能,把整個frame分成很多塊。在VR、AR中,使用者往往只對其中一個塊感興趣,那我們可以很快找到對應的塊進行解碼。

最後,我們的測試平臺是www.arewecompressedyet.com。對AV1感興趣的同學,可以自己去測試。

http://www.itdks.com/dakashuo/playback/1191,檢視大會視訊回放。