技術分享 | 張賢國:給用戶以完備體驗的騰訊V265編碼器

  • 2019 年 10 月 5 日
  • 筆記

在超高清視頻畫質需求與網絡帶寬桎梏的博弈中,視頻編碼無疑是所有公司關注的重點,短短兩年時間,騰訊自研服務端編碼器V265從最初的原始框架,到現如今的大幅完善落地使用,期間經歷了大大小小無數次的迭代、優化。如通過自適應碼率分配提升壓縮效率,採用三級碼率控制模型精準調控碼率。本文由騰訊雲專家工程師張賢國在LiveVideoStackCon 2019北京大會的分享內容整理而成。

文 / 張賢國

大家好,我是張賢國,畢業後長期從事於視頻編碼標準制定(HEVC、VVC),以及視頻編碼器(H.265)研發工作,2017年加入騰訊,主要負責視頻編碼研發相關工作。本次分享將重點介紹V265編碼器的業務體驗優化,包括碼率控制優化以及業務適配相關的優化。主要內容可以分為三個部分,首先簡單介紹V265的最新情況,然後重點講解V265在碼率控制方面所做的一些優化,最後會介紹V265編碼器在業務落地過程中遇到的一些問題與解決方案。

1. V265最新情況介紹

目前,V265編碼器可配置的編碼速度級別已經達到11個以上,並且能夠支持多個服務端的轉碼平台,以及直播,點播,零延遲,雲遊戲等多種業務下的延遲環境。在碼率控制方面,V265支持包括ABR,CBR,VFR, 多PASS,CRF等在內的多種碼率控制方法。

除此以外,V265編碼器支持分佈式的碼率控制、自適應碼率編碼、場景的自適應以及設備的兼容性優化。另外還支持自適應ROI編碼並且將要支持編碼器內的視頻處理,並且在今年上半年我們還完成了對4K 10bitHDR和杜比畫質的編碼和播放支持。

2017年11月份,V265編碼器有了第一個原始框架,到現在已經發展了兩年左右的時間。在2018年初,也就是研發過程進行了一年左右的時候,我們參與了MSU比賽,V265編碼器獲得了主觀質量評價第一名的好成績。並且在後續的4K比賽中,迭代後的1.2版本的PSNR/SSIM綜合效果也是最佳的。之後的時間,我們開始面向業務邏輯對編碼器進行優化,例如在接下來的版本中,我們分別做了壓縮率的幾率提升、4K實時編碼以及解決設備兼容問題。在2019年的最新1.4.0版本中V265編碼器全面支持10bit編碼,並且成功將壓縮率優勢擴大至20%。

上圖是V265,X265,X264三種編碼器的基本壓縮率情況對比,橫軸表示壓縮率(從左到右,壓縮率由高到低),縱軸表示壓縮速度。

從圖中可以看出,在140個8bit 視頻與20個10bit 視頻,ABR算法的相同測試條件下,與X265相比V265不管是壓縮率還是壓縮速度,都是最高的。比如最低的兩個點:placebo和veryslow。在單Pass placebo上,相比於X265的veryslow檔可以節省超20%的碼率,編碼速度也高出80%。V265編碼器的最高速度可以達到X265placebo下的200多倍,同時,最差的壓縮率也要高於X265medium檔的壓縮率。

總的來說在單pass下,相比於X265的veryslow檔V265可以節省20%碼率,相比X264最慢檔,節省碼率則超過60%。在相同速度下,如果編碼速度要求越快,V265相比X265的優勢就越大。

V265編碼器的測試集總共包含140個8bit 視頻,包含多種分辨率,覆蓋15個場景。除去JCTVC的部分Video之外,大多是業務側的Video,例如小分辨率的視頻,短視頻,電影,遊戲,演唱會以及一些複雜的混合場景和超高清。

在測試中得出的平均結果,基本上V265 fast檔的BD-Rate與X265的veryslow檔,X264的veryslow檔相近,但編碼速度是X265的34倍左右。

上圖左側展示的是MSU比賽的主觀對比結果,從圖中不難看出,V265在主客觀評價方面都是最優的。另外,右側展示的是4K的客觀對比結果,其中SSIM評價結果與競品相比差距不到1%,而PSNR評價結果遠高於競品。

2. 碼率控制優化策略

接下來將介紹具體技術實現過程中所遇到的問題與解決方案,內容主要分為三個部分。第一部分,自適應的碼率分配,主要是為了在碼率控制環境下提升壓縮效率;第二部分,精準碼率控制,提升了碼率波動的平穩度;最後是多遍編碼以及其他優化。

2.1 自適應碼率分配

V265編碼器的碼率控制流程主要分為以下幾個環節,首先通過預分析,分析出塊與塊之間的量化關係;接下來就是幀級別的編碼控制以及CTU級的編碼,最後則需要對碼率,控制參數進行更新。

碼率控制流程中最重要的優化就在於如何結合預分析與VBV緩存的結果來重新估計碼率,並根據估計碼率來調整每個圖像或者CUTREE的QP偏移。

接下來介紹CRF算法下QP預測模型優化的一個例子。在開源軟件中存在一個問題,CRF的取值與QP都是嚴格一對一的,例如CRF等於23,QP一定嚴格等於幾。我們所進行的優化就是要根據當前幀的複雜度,優化CRF與QP之間的映射關係。這個在純CRF下可以節省3%的碼率。基本想法就是讓更多的碼率用於人眼敏感的平坦區域,舉個例子:

如圖中展示的連續3幀圖像,幀內的複雜度是從複雜到簡單的。第一幅圖複雜程度較高的樹的部分會更多,紋理會比較細節。而最後的圖像則更側重於人眼敏感區域,人的部分會更多。我們可以在CRF到QP的映射結果中看到,雖然每幀的CRF都等於23,但BaseQP(幀級的基礎QP)都是不一樣的,這就實現一種類似於幀級的內容自適應。

定碼率模式

接下來重點講解定碼率的模式,無論是CRF還是ABR算法,都存在一個VBV的控制。圖中展示的是ABR算法下的碼率控制基本流程。

首先我們要進行的是碼率預測模型的初始化。假設當前出現一幀M,接下來我們就需根據複雜程度估計M幀的量化參數,如果存在cbr溢出,就需要進行一些限制。第三步,判斷VBV緩衝區給當前幀分配碼率的上下限,然後預測M~M+8幀圖像的碼率,判斷總碼率是否位於上下區間內,如不在上下區間內,則需要相應調整其量化參數。最後就可以編碼當前圖像,並對初始模型進行更新。

對於碼率控制的過程,我們進行了一系列的優化。針對碼率預測模型初始化過程,我們設計了多場景的幀級碼率預測模型包括:I/GPB/B0/B1/B2模型;簡單幀,複雜幀,靜態幀的碼率預測模型並且通過機器學習的方法來估計I幀的碼率。在量化參數預測方面,傳統參考軟件主要是碼率,累計複雜度兩位相關,而我們在其中則加入了當前幀複雜度的考量,實現了三相關的碼率初始QP計算過程。

除此之外,還有包括VBV緩衝區上下限自適應計算、VBV內QP的調整優化、在輸出QP時進行約束以及碼率預測模型提前更新等優化。

自適應量化

為什麼我們要在碼率控制這部分內容中講到自適應量化?這是因為自適應量化會影響每一幀的Cost,也就會影響到碼率的控制。

自適應量化包含時域自適應量化以及空域自適應量化。所謂時域自適應量化,如圖所示,從後往前,從後面任何一個塊找到其在參考幀中的傳播代價,傳播代價越高,就認為這個塊被參考的概率越大,量化參數QP也就會越小。空域自適應量化就是根據當前幀內的不同區域的複雜度,選擇不同的量化策略。例如人眼不敏感的複雜區域,量化參數就會偏大一些。

在時域自適應量化中,會為每一幀計算一個QPoffset,而offset相比baseQP可能會過大,影響碼率控制以及壓縮率。因此,我們根據這個問題進行了部分優化創新,在預分析過程中建立幀間baseQP估計模型,引入碼率控制,達到offset最大值與baseQP相關聯的效果。

另外,在時域空域的聯合優化中我們也進行了一系列的優化,例如:時域自適應量化強度與空域自適應量化強度怎麼調整、對高碼率點的空域自適應量化進行特殊處理以及降低打開空域自適應量化後的PSNR損失。

2.2 精準碼率控制

V265的幀級碼率控制特點是包含多種碼率控制模型,簡單幀,複雜幀,靜態幀以及不同的預測幀,準確率會更高。對於行級碼率控制,V265編碼器本身並沒有進行過多的優化。不過V265新設計加入了CTU級別的碼率控制模型,可精準調整QP。

(X265行級碼率控制示意圖)

如圖所示,X265隻能在每行的對角線X位置處調整一次QP,其它點的QP均是由X位置繼承而來。因此,就會產生一個問題:如果編碼圖像為豎直結構,最下方的三角形區域就無法完成有效的QP調整。而V265編碼器存在編碼單元(CTU)級的碼率控制模型,所有區域均有QP調整能力。因此,碼率控制的精準度就會得到提升。

(X265、V265碼率波動曲線)

圖為X265編碼器、V265編碼器以一幀為單位計算出的每一秒的碼率波動。當取值為0.95時,V265碼率波動與X265相近。當取值為0.2的時候,V265的碼率波動會遠小於X265。因此,對於那些對碼率波動要求比較高的直播業務來說,V265編碼器會更加適合。

ABR條件下V265與X265對比(點播)

相同速度下V265與X265對比(直播)

如圖所示,在ABR條件下(點播),V265的平均碼率誤差與X265的平均碼率誤差相比要低1%,而在相同速度下(直播),V265的平均碼率誤差是X265的平均碼率誤差的1/3,可以節省30%左右的帶寬。

2.3 多遍編碼及其他優化

當某視頻源需要進行轉碼操作,在執行多遍編碼時,第一遍可能只採用一種編碼,第二遍則可能編碼多種分辨率。而目前的開源軟件,並不支持第一遍編碼時的分辨率與第二遍編碼時的分辨率不同。並且普通二遍編碼的壓縮率也並不是很好,提升有限。針對這兩個問題,V265編碼器添加了針對兩遍編碼分辨率不同的支持,720p的一遍結果可給二遍360p/1080p使用。此外,V265編碼器還增加了一些列針對二遍編碼壓縮率的優化,使得二遍編碼的客觀質量進一步提升。

對於其它碼率控制,V265還提供了豐富的ROI接口,不僅僅是用戶可靈活控制的ROI區域QP量化接口,還提供了整體的CRF偏移接口。

此外,在上半年的工作中,因為部分客戶有雲遊戲的服務需求,而雲遊戲的場景對於延遲的要求為0,因此除幀內多線程以外的所有線程均不能啟用。此時,我們需要保證編碼器環路不存在delay,並且編碼器還需要對預測參考策略進行部分優化。也就是說低延遲下的VBV緩衝區需要調整,低延遲對分層GOP結構的支持需要進行擴展。

VFR(variableframe rate) 碼率控制在遊戲直播場景中,有時需要根據輸入時間戳來控制碼率分配。也就是說相鄰兩幀的時間戳並不是固定的。如圖,輸入源時間戳由0,1直接到4、5,也就是說編碼器在碼流採集的過程中丟掉了2,3兩幀。此時,X265隻能定幀率編碼,按固定幀率重新計算時間戳,會重複編碼3次綠色圖像,綠色各分配一幀碼率。而V265則可支持可變幀率編碼,給綠色圖像分配3幀碼率,並且保留原始時間戳編碼,使得綠色圖像畫質更高,總體碼率控制精度大大提升。

3. V265業務落地優化

3.1 極速高清-內容自適應轉碼

當前已有的傳統轉碼服務還存在一些問題。第一,傳統方案採用固定的編碼工具,但實際上不同視頻的最優參數是不同的;第二,傳統方案採用固定的轉碼切分粒度,但由於不同視頻的最優參數不同,將不同場景切在一起,無法找最優參數;第三,傳統方案採用固定碼率或質量轉碼參數,不能合理分配碼率,簡單視頻碼率浪費、複雜視頻質量不足。仍不能保證畫質。

極速高清的內容自適應轉碼可以對場景切換進行監測,以鏡頭切片為基礎進行分佈式轉碼;並對視頻內容進行分類,在離線參數調優平台中對每類視頻進行離線調優編碼參數。最後通過視頻內容分析,即視頻特徵(視頻複雜度特徵,編碼特徵)計算與深度學習預測,有效防止碼率浪費問題。

3.2 主客觀問題的發現和解決

客觀問題的發現與解決

V265編碼器提高客觀質量最重要的一個方法就是不斷豐富測試集和測試條件:即測試更多的視頻,增加碼率控制條件,同時收集業務問題視頻,通過對比分析各種質量評價指標,不斷進行優化。

在調優的過程中,我們發現某個版本的編碼器存在這樣一個問題:算法的部分閾值在某些場景下只做skip,跳過merge模式,於是就會產生部分損失,導致部分簡單Video的指標驟降。

此外,還有一個問題就是2pass比1pass編碼的PSNR指標變差很多。之所以出現這種情況,主要是由於2pass原理上傾向於均衡每幀的QP編碼,在碼率足夠的情況下,針對簡單,複雜場景的編碼壓縮程度控制過高。因此如果碼率足夠,在對VBV進行優化時,第一遍編碼對簡單、複雜場景做了自適應的碼率分配,那麼第二編碼就要盡量保持這一特徵。

另外,我們還面向各種場景進行優化。編碼器在每個Tunegrain測試時,都會測試三個參數 PSNR、SSIM、VMAF。在測試中我們發現一個特點,如果PSNR與SSIM指標的測試結果都比較好,那麼VMAF指標不會變差。在調優部分,對於一些人工視頻,我們通過對其部分參數進行調整,提升BD-rate。此外,我們還可以實現對VMAF單一指標進行優化。

為了定位主觀問題,我們每個測試都會報告平均碼率誤差,峰值碼率誤差以及最小客觀質量。舉個例子,紅線部分是我們以前的測試基準,縱軸為PSNR參數的值,從圖中可以看到,PSNR存在低峰,這就意味着視頻每間隔一段時間就會變糊一次。所以當我們在引入最小客觀質量後,就發現其中某些算法存在問題,之後我們對算法進行了優化,最終結果如圖綠色部分所示。

主觀問題的發現與解決

針對主觀問題的發現,首先要定期進行主觀測試,開發主觀比較工具,發現問題,做出總結報告,對出現問題的Video進行細節排查。除此之外,我們還與業務協同搭建灰度測試沙盒,及時上報問題。

點播主觀問題舉例

針對部分細節編碼丟失的問題,我們經過排查發現,其主要原因是在點播場景中如果對於VBV的限制過高,會導致某些幀的QP過大,產生主觀問題。

在直播場景中,vfr編碼下產生視頻在場景切換後,碼率極低,主觀很差的現象。這主要是因為輸入源時間戳連續兩幀相同(非正常),引發編碼器分配碼率的bug。

在視頻編輯時,場景切換的I幀與用戶指定的I幀不在同一位置,導致碼率不夠用,產生馬賽克。因此我們限制指定I幀附近不自動插入I幀,避免I0和Ik 之間的碼率分配異常。

由於分佈式碼率控制時,對片間場景切換後做了調整,導致場景切換後的部分細節模糊。針對這個問題,我們限定分佈式碼控的QP調整區間不超過場景切換。

3.3 業務側V265編碼播放能力兼容

長期參考幀的軟解、芯片解碼支持

關於長期參考幀的軟解、芯片解碼的支持,由於部分電視機芯片驅動層以及部分軟解播放器的支持不完善,因而無法識別長期參考幀對其進行解碼。此外,在FFmpeg中,由於其解碼器能力支持不完善, 當參考幀列表包含poc=X(短期)和poc=X+256(長期)兩幀時,解碼器會認為X與X+256兩幀幀號等同,引發崩潰。因此我們應盡量避免X與X+256作為長期參考幀出現,並且對於部分用戶可能會強制關閉長期參考幀。

CRA I 幀的軟解、芯片播放支持

H.264 為IDR GOP編碼,其中每一個Close GOP的B6、B5、B7幀都只能前向參考,而H.265引入了CRA幀的概念,將B6、B5、B7幀編在CRA幀之後,以實現前向參考與後向參考,提升壓縮效率。通常情況下,按照標準規定,解碼器在隨機訪問第8幀時,只需要解碼幀號大於8的圖像。但部分解碼器在解碼CRA8之後,繼續解碼B6、B5、B7幀,導致播放出現花屏。所以在部分業務中會強制使用Close GOP編碼。

電視機解碼器不支持多分層B幀

在電視機解碼器中存在部分解碼器認為265碼流為標準碼流,B幀只有一層,不存在多參考B幀。因此如果有多參考B幀,如B6、B5、B7幀出現,就無法完成解碼。針對這一情況,我們可以將V265設置成只包含一層參考B幀的結構,但相對應的壓縮率也會有所犧牲。

FFmpeg3.x解碼時Seek到片頭邏輯Bug

FFmpeg 3.x版本存在一個Bug(在FFmpeg4.x版本已經修復),即在解碼過程中,如果片頭同時存在間隔較短的兩個I幀,Seek會直接指向第二個I幀,因此需要編碼器在編碼時盡量避免在開始處存在間隔較短的I幀。

SPS中dpb配置的手機、電視播放端兼容性問題

SPS中存在一個dpb的語法,其標準規定是很精簡的,用了多少就可以寫多少,但部分解碼器是按照X265標準設計,只支持冗餘的解碼,不兼容精簡標識方法,導致V265碼流無法播放。因此,V265編碼器使用最大冗餘的標識方法,避免出現dpd管理問題。

長按識別二維碼,關注騰訊雲視頻

點「在看」給我一朵小黃花