B站自研新一代影片編碼器 BILIAV1

碼農談IT發表於2023-11-23

來源:嗶哩嗶哩技術


1. AV1 影片編碼標準介紹


AV1是開放媒體聯盟(AOM, Alliance for Open Media)開發的第一代開放,免版稅的影片編碼標準。AV1於 2018 年 3 月定稿,相同畫質下,位元速率比 H.265/HEVC 低 20% 左右。經過 Google、Netflix、Meta、Amazon 等網際網路巨頭的不斷推廣,目前 AV1 生態逐步發展成熟:PC 側顯示卡供應商 AMD、 Intel 和 Nvidia 均已經發布支援 AV1 硬解的相關產品;移動端 MediaTek、 Qualcomm 和 Apple 的旗艦手機晶片都已經支援 AV1 硬解;軟體解碼器 dav1d 已經具備主流平臺的實時解碼能力[1]。2020年底 B 站開始自研 BILIAV1 編碼器,2022年初開始在 PC 側點播業務部署 AV1 編碼,目前正在積極籌備 AV1 編碼在直播業務上的應用。


2. AV1 標準的主要壓縮技術


AV1 整體仍是混合編碼技術框架的繼續演進和最佳化,我們先簡要介紹 AV1 標準的一些主要技術[2]


B站自研新一代影片編碼器 BILIAV1

圖1: AV1 塊劃分


  • 塊劃分

AV1 中最大的塊稱為 superblock,其大小可以在 sequence header 中設定為128×128 或 64×64。通常只有在小解析度或為了提升並行能力的情況下才配置為 64×64,否則配置為 128×128 以提升壓縮效率。和 H.265/HEVC 一樣,AV1 也使用了迭代塊劃分的設計。每個 2N×2N 塊可以繼續劃分為 4 個 N×N 的小塊,直到達到最小的塊大小 4×4。以外,AV1 還支援一分為二的 rect 劃分,一分為三的 ab 劃分和一分為四的 h4 和 v4 劃分,不過這些劃分不允許被繼續劃分。

  • 預測

幀內預測。除了繼續最佳化傳統幀內預測演算法,比如更加精細的預測角度,更多的平滑預測模式(smooth intra prediction)等,AV1 還引入了迭代預測(recursive intra prediction)和跨分量預測(chroma from luma prediction,CFL)。此外, 新引入的調色盤預測模式(color palette)和 幀內塊複製(intra block copy)可以顯著提升螢幕場景下的壓縮效能。

幀間預測。AV1 最多支援 7 個幀間參考幀,每個幀間預測塊可以從這 7 個參考幀中選擇 1 個或 2 個作為參考幀(並不是所有的組合都是合法組合)以進行單向或雙向預測。其中,單向預測模式時最多有三種 motion mode,分別是 translation、 obmc 和 local warp。除了常規的平均加權預測(Average Predictor)和基於參考幀距離的加權預測(Distance Weighted Predictor)外,AV1 還引入了基於兩個參考塊畫素差的加權預測(Difference Weighted Predictor)和楔形模式(Wedge Mode)。

幀內幀間預測。該預測方式透過預設的權重模板把幀內預測值和幀間預測值逐點加權平均得到最後的預測值。其中,幀內預測只允許 DC、垂直、水平、平滑模式。AV1 tool off 測試表明,該模式平均有 0.7% 的位元速率收益。

  • 變換

AV1 採用最大深度為 2 的遞迴搜尋最優 transform size 的方案,標準允許的最大和最小transform size分別是 64×64 和 4×4。4 種 1-D 變換型別——DCT、 ADST(asymmetric discrete sine transform)、FLIPADST(flipped ADST)和IDTX(identity transform,transform skip),可以兩兩組合成16種 2-D 變換型別。不大於 32×32的塊最多可以有 16 種2-D變換型別, 32×32 及以上只允許 DCT 和 IDTX。

  • 環路濾波

AV1有三種環內濾波器,按照處理的先後順序,分別為:

  1. Deblocking filter: 目標是去除塊效應。

  2. CDEF(Constrained Directional Enhancement Filter): cdef 首先檢測邊緣方向,然後基於邊緣方向做非線性濾波。可以認為 cdef 是一種“保邊”濾波器。

  3. Loop Restoration Filter。該濾波器處理單元是 LRU(loop restoration units), LRU的大小由幀級別語法引數指定,可以是 64×64、 128×128或256×256。每個 LRU 可以有三種選擇:Wiener Filter、 Self-Guided Filter 或不濾波。


3. BILIAV1自研之路


B 站早在 2020 年就開始關注 AV1 標準。當時 chrome 瀏覽器已經支援 AV1,但不支援 H.265/HEVC 。當AMD、 Intel、 Nvidia 紛紛推出支援 AV1 硬解的產品後,我們意識到 AV1 標準有極大機率會在網頁端推廣開來。

BILIAV1 專案開始於 2020年10 月份。當時開源的軟體編碼器主要有參考程式碼 Libaom 和 Intel 的 SVT-AV1。基於已有開源產品的二次開發可以節省大量基礎元件的研發時間,是編碼器比較穩妥的研發路線,但 B 站編碼團隊的研究發現,雖然 Libaom 和 SVT-AV1 都有明顯的可以最佳化的空間,但其原始架構設計嚴重製約了許多最佳化技術的運用,因此,基於團隊已有的技術積累,我們決定從零自研一款 AV1 編碼器。


B站自研新一代影片編碼器 BILIAV1

圖2: 同畫質下 BILIAV1 和 SVT-AV1 效能比較


首先看一下我們 BILIAV1 的效能資料。橫軸是編碼速度(對數刻度),縱軸是 PSNR 維度的 BDRate,SVT-AV1 1.7.0 版本 preset 7 的結果作為 100% 速度和 100% 位元速率點。B 站影片以 UGC (User-generated Content)為主,對轉碼速度有較高要求,所以我們選擇 SVT-AV1 1.7.0   相對較快的 preset 7 檔位作為 anchor。BILIAV1 2.4.0 是我們最新發布的產品版本,目前使用 preset 4 作為點播檔位。相同畫質下:BILIAV1 2.4.0 preset 4 比 SVT-AV1 1.7.0 preset 7速度慢 36%,位元速率低 19.6%;BILIAV1 2.4.0 preset 4 比 SVT-AV1 1.7.0 preset 6 速度快 25%,位元速率低 12.4%。按照圖2 的資料趨勢,在 B 站點播檔位,同畫質同速度下, BILIAV1 2.4.0 位元速率比 SVT-AV1 1.7.0 低 15% 左右。BILIAV1 2.4.0 preset 0 是 B 站還在開發中的直播檔位,與 SVT-AV1 1.7.0 preset 8 速度相當,但位元速率低17.3%。

編碼器研發主要包括工程和演算法兩個方面。工程方面需要考慮的事情較為繁雜,例如:測試和trace 系統、並行設計、資料結構、記憶體利用、SIMD彙編等;演算法方面主要有:位元速率分配/控制、標準演算法實現、快速演算法等。演算法是編碼器研發的核心,但工程是無疑是編碼器研發的基礎。BILIAV1 編碼器從零研發,一開始就面對巨量的基礎模組開發工作。以下透過幾個例子來分享 BILIAV1 的研發歷程。


3.1 TRACE系統


專案一開始,我們就整理了自研編碼器研發經常會遇到的一些典型工程除錯問題:

  1. 不一致問題:編解碼不一致,debug/release 不一致, 多次測試結果不一致等

  2. memory 相關:memory leaks, stack buffer overflow, heap buffer overflow 等

某些問題的定位有時是特別困難的。比如自研編碼器不可避免經常會遇到熵編碼和熵解碼不一致的問題,由於熵編碼的上下文依賴,有時候並不能很快定位出問題的第一現場。特別是剛參與編解碼的新手工程師,遇到這類問題經常覺得十分棘手。


解決問題的前提是發現問題,充分的測試是編碼器高質量交付的基礎。我們基於已有的測試框架快速搭建了 BILIAV1 的測試框架,具體的測試項有:編解碼一致性測試、解析度測試、tool 開關測試、debug/release 一致性測試、多執行緒一致性測試、AddressSanitizer 測試等。在研發前期,編碼器速度較慢,高效的 case 無疑是可以快速迭代編碼器的基礎。以解析度測試為例,遍歷解析度無疑是最充分的方案,但很明顯也是最低效的方案。因此,我們只在釋出重點版本才使用遍歷方案,而對於 patch 測試,我們的測試解析度只包括

  1. 非整數個 superblock 行/列和非整數個 LRU行/列: 以步長為 4 遍歷 4×4 到 512×512 的解析度

  2. 最大解析度。


BILIAV1 TRACE系統:

  1. 關鍵模組的 log 資訊,包括預分析cost, 運動搜尋,分階段 RDO cost 和決策結果,熵編碼context和碼流,位元速率控制引數更新等

  2. 執行緒排程資訊

  3. 重要節點的畫素值或 CRC

TRACE 可以幫助研發工程師快速定位問題,特別是對解決專案初期 的bug 幫助極大。


3.2 並行設計


AV1 壓縮率的提升無疑需要更大的算力。現在 CPU 單核效能的提升越來越難,新編碼器的算力需求往往需要藉助多核並行才能滿足。


預分析


主要包括 cutree、aq、 mctf。預分析計算基於原始畫素進行,主要的計算有 intracost、 intercost、variance 等,均可幀級/slice級並行。


主編碼器


幀間並行

參考幀結構:低 temporal layer 的幀要儘量避免使用高或者同 temporal layer 的幀做參考。BILIAV1限制:mini-GOP 內部只允許 temporal layer 小於當前幀 temporal layer 的幀做參考幀;mini-GOP 間,可以使用高 temporal layer 的幀做參考,但是參考幀的 temporal layer 最多不能超過當前幀 temporal layer + 1

幀間參考延遲:無論是行級別等待還是塊級別等待,垂直方向的 search range 都直接影響幀並行能力。BILIAV1 藉助預分析得到的運動向量,自適應決策當前塊的search range, 以在不影響壓縮效能的前提下,最大化幀間並行能力。

需要特別指出的是:

  • 對 AV1 的 deblocking filter、cdef、 loop restoration 使用幀級別的引數決策可以有 3% 左右的位元速率收益,但是編碼 fps 下降較多,為了保證整體編碼 fps 滿足產品部署需求,此時可以透過 mini-GOP 間並行來提高編碼速度。

  • AV1 支援當前幀的熵編碼初始機率來源於已經編碼的某個幀。該工具有 1% 左右的位元速率收益,但需要等待被繼承幀的熵編碼結束才編碼當前幀。因此,對幀並行有一定影響。有兩種方法可以部分解決這個問題:1) 繼承較遠距離幀的熵編碼機率,例如使用上個 mini-GOP 中已經編碼結束的幀;2) 主編碼器模式決策和熵編碼使用不同的熵編碼機率,這樣當前幀模式決策部分就可以和被繼承幀並行處理。

Superblock 並行

AV1 標準雖然並沒有規定類似HEVC WPP這種並行編碼方式,但仍然可以採用 WPP 這種方式來實現 Superblock 級別的並行編碼,與 HEVC WPP 不同的是,AV1 Superblock 並行下,模式決策使用的熵編碼機率只是實際熵編碼機率的估計值,並不是實際的熵編碼機率。

環內濾波並行

開啟幀級別決策濾波引數時依次決策 deblocking filter、cdef 和loop restoration 的引數。此時,透過把一幀劃分為多個 slice 的方式可以實現並行加速;

關閉幀級別決策濾波引數:在某一個 Superblock 行中,第 N 個 Superblock 模式決策結束,就依次啟動 第 N 個superblock 的 deblocking filter,第 N - 1 個 Superblock 的 cdef ,第 N - 2 個 Superblock 的 loop restoration filter。


B站自研新一代影片編碼器 BILIAV1

圖3: 幀級別決策濾波引數關閉下的環路濾波並行


指令並行

BILIAV1 使用 SIMD intrinsics對耗時模組進行加速,對於比較複雜的模組又進一步使用 asm 彙編加速。例如:BILIAV1 使用 asm 彙編重新設計和實現了 transform type 和 transform size 部分的彙編,與 intrinsics 相比,asm 可以整體加速 10% 以上。


3.3 快速演算法


快速演算法是自研編碼器的核心,幾乎所有核心模組都需要高效的快速演算法才能滿足產品部署對編碼速度的要求。這裡重點介紹一下參考幀剪枝相關的快速演算法。AV1 標準規定最多可以有7個幀間參考幀,並最多允許 28 種參考幀組合。與只使用最鄰近參考幀相比,多參考幀帶來的平均位元速率收益約為 4%。這裡分享幾個參考幀剪枝的快速演算法:

  1. 基於已經嘗試過的劃分的較優參考幀,來剪枝當前劃分的參考幀。例如:如果已考察過 SPLIT 劃分,那麼可以基於子塊的較優參考幀剪枝當前塊的參考幀;可以基於 NONE 劃分的較優參考幀來剪枝非 NONE 劃分的參考幀。

  2. 基於 MVC (motion vector candidate) satd/sad cost做參考幀剪枝。除了標準規定的那些 motion vector predictor 以外,此處的 MVC 還可以包括預分析得到的 motion vector, 已經嘗試過的劃分的 motion vector, history mv[3] 等。該演算法會排除 mvc cost 較大的參考幀。

  3. 先做單向參考,接著只選用較好的單向參考幀來做雙向參考。

  4. 基於預分析場景檢測剪枝參考幀。如果某個參考幀和當前幀之間有場景切換,直接排除該參考幀; 如果沒有場景切換,高 temporal layer 的幀只選擇最鄰近的參考幀和重建質量最高的參考幀。


4. 總結和展望


BILIAV1 是 B 站自研的效能優異的 AV1 編碼器,目前已經上線 web側點播轉碼。BILIAV1 2.4.0 較開源 SVT-AV1 1.7.0 編碼器平均位元速率節省約 15%。隨著 iPhone 開始支援 AV1硬解,可以預見未來幾年 AV1 在移動端的部署量會逐步上升,B 站也會繼續加大在 BILIAV1 上的投入,這裡列出 BILIAV1 未來要進一步最佳化的點:

  1. 點播方面:開發更加高效的快速演算法,以便在點播檔位開啟一些效能更好的工具。

  2. 直播方面:與點播相比,AV1 的直播部署更具有挑戰性。隨著點播檔位的逐漸成熟,BILIAV1也會逐步加大在直播檔位的應用。


5. 參考資料


[1] 

[2] J. Han et al., "A Technical Overview of AV1," in Proceedings of the IEEE, vol. 109, no. 9, pp. 1435-1462, Sept. 2021, doi: 10.1109/JPROC.2021.3058584.

[3] L. Zhang et al., "History-Based Motion Vector Prediction in Versatile Video Coding," 2019 Data Compression Conference (DCC), Snowbird, UT, USA, 2019, pp. 43-52, doi: 10.1109/DCC.2019.00012.


嗶哩嗶哩多媒體實驗室是一支技術驅動的年輕隊伍,具備完善的多媒體技術能力,以清晰流暢的極致影片體驗為目標,透過對自研影片編碼器、高效轉碼策略、影片影像處理、畫質評價等技術的持續打磨和演算法創新,提出了畫質可控的窄帶高畫質轉碼演算法、視覺無損影片前處理、超實時4K60FPS直播超分、高效影片影像處理引擎、BILIVVC編碼器等諸多高質量、低成本的多媒體解決方案,從系統尺度提升了整個轉碼系統的效能和效率, 助力嗶哩嗶哩成為體驗最好的網際網路影片社群。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2996703/,如需轉載,請註明出處,否則將追究法律責任。

相關文章