揭秘腾讯会议背后的视频编码“神器”
作者:張清,騰訊多媒體實驗室高級研究員。
作為一款實時音視頻通信產品,騰訊會議里面有海量的音視頻數據需要進行實時傳輸,比如我們的攝像頭畫面,屏幕分享的數據等。這些數據量非常龐大,通常需要經過編碼壓縮再進行傳輸,那么騰訊會議里有哪些視頻編碼方面的”神器”呢?本文將一一為大家揭曉。
一、時域SVC
在視頻編碼中,有三種幀類型:
I幀:只能進行幀內預測,可以獨立解碼;
P幀:單假設參考幀,也就是通常說的前向預測幀,只能使用它之前的幀進行預測;
B幀:雙假設參考幀, 一般為雙向預測幀。
由于B幀會帶來不可避免的延遲,因此在實時通信中通常只使用I幀和P幀這兩種幀類型。
I幀只使用了本幀的信息進行預測,也就是說I幀的解碼不依賴于其他幀,因此可以獨立解碼,但I幀的編碼效率偏低,數據量較大。
P幀使用了幀間預測方法,可以參考之前的一些解碼幀信息,能達到較高的壓縮效率(幀大小比I幀小很多),但是解碼時必須依賴于其他幀。
在實際的應用場景中,為了提升壓縮效率,往往會使用IPPP的幀結構,即I幀之后編碼N個P幀。但當網絡情況不好時(如抖動,丟包,限速等),這種幀結構就會造成長時間的卡頓。
如下圖所示,第0幀為I幀,后續7個幀均為P幀,且每個P幀只有一個參考幀(為其前一幀)。當網絡發生丟包時,第3幀丟失,由于第4幀參考第3幀進行壓縮,因此不能正確解碼,5~7幀則類似。
這種情況下,即使丟包只造成個別幀的丟失,但由于接收端很多幀不能正確解碼,會造成長時間的卡頓,只能通過申請I幀的機制進行恢復。
IPPP幀結構參考關系
為了解決這一問題,我們加入了時域SVC技術,對參考幀結構進行了調整。
時域SVC幀結構參考關系
我們可以將視頻幀分為若干層,上圖以3層為例:
Layer0的幀只能參考同樣為Layer0的幀,不能參考Layer1和Layer2的幀;
Layer1的幀可以參考Layer0和Layer1的幀,不能參考Layer2的幀;
Layer2的幀可以參考Layer0~2的幀。
越低層級的幀被參考的可能性越大,因此重要性也越大。在網絡發生丟包時,只要所丟的幀不是Layer0層,就不需要重新申請I幀,解碼端就可以持續成功解碼。如上圖中第1幀丟失僅會影響2,3幀,其他幀不會受到影響。
此外還可以結合網絡層的策略,對低層級的幀多加一些保護(如FEC),降低其丟失的概率,能有效地解決卡死的問題。在參會的下行人數很多時,可能會有小部分下行網絡較差,如果采用傳統的IPPP結構,則當某個下行損傷時就需要不斷的申請I幀來恢復,這樣就會影響到其他接收端的視頻體驗;如果采用時域SVC的結構,在能夠保證少數的下行網絡存在問題時,其他的下行端不會受到影響。
說了這么多,我們來看一下實際的效果吧!第一個視頻示例是IPPP結構在網絡損傷時的表現,卡頓感很明顯;接下來是采用時域SVC的版本,幀率會有所影響但整體還算流暢。
IPPP幀結構網絡損傷效果
時域SVC幀結構網絡損傷效果
ROI檢測以及基于ROI的編碼
攝像頭內容是騰訊會議中的一個主要視頻場景。在此場景中,人眼往往比較關注人臉區域,對背景區域的關注度較低。因此,我們加入了人臉檢測算法和基于感興趣區域(Region of Interest, 簡稱ROI)的編碼算法。
這類算法的主要思路是:實時地檢測出當前視頻中的ROI區域,將其傳入到編碼器內部,編碼器進行單幀的碼率重分配。對ROI區域,增大其碼率,能使該區域編碼的更好,提升主觀質量;對于非ROI區域,降低其碼率,則總的碼率不會超出目標碼率。
在ROI檢測方面,因為騰訊會議是一個實時性要求很高的場景,對算法復雜度很敏感,我們使用一些傳統的算法,結合編碼器的一些預分析結果,確定最終的ROI-map,對于1080p的視頻,單幀檢測耗時在0.3ms以內,完全滿足了實時性的要求。
基于ROI的檢測和碼率調整算法的優點在于:在低碼率的情況下,能極大地提升主觀質量;在高碼率的場景下,可以保持主觀質量基本不變,碼率節省20%~30%,以下是一些對比效果:
低碼率效果對比 (左)關閉ROI ?(右)開啟ROI
高碼率效果對比 (左) 300kbps, 關閉ROI ?(右) 210kbps,?開啟ROI
屏幕內容編碼技術
屏幕分享/白板等屏幕類內容是騰訊會議中另一類視頻場景。屏幕生成的視頻與攝像頭采集的視頻存在很大的不同:屏幕視頻通常沒有噪聲,色調離散,線條細膩,邊緣銳利;相反的,攝像機拍攝的視頻通常存在噪聲,色調連續且豐富,紋理比較復雜。
傳統的H.264和H.265編碼器采用的是基于塊的混合編碼框架,包含預測,變換,量化以及熵編碼。其中變換模塊主要的目的是將殘差信號從空域變換到頻域,使信號能量更集中,也方便基于不同的頻率分量做不同的處理,減小編碼所需的比特數。
但是,對屏幕分享的內容,采用基于變換的編碼方法,會損失其高頻細節,導致用戶觀看的視頻變得不清晰。
基于上述原因,我們在H.265編碼器中加入了一些有效的屏幕內容編碼技術(Screen Content Coding,簡稱SCC),包括幀內塊拷貝和調色板編碼。
我們在前面的介紹中也提到過,一般情況下I幀編碼效率要比P幀差,主要原因是P幀可以利用時域上的信息進行預測,預測精確度往往很高,這樣編碼的信息量就變少了。
如下圖所示,第N幀與第N-1幀之間只有很少量的運動,所以用第N-1幀的信息來預測第N幀相對來說會很準確。
幀間預測示例圖
所謂的幀內塊拷貝,是指借鑒了幀間預測的方法,在I幀中引入基于運動矢量(Motion Vector, 簡稱MV)的預測,提升其預測精確度,極大地提升了I幀的壓縮效率。
該方法之所以在屏幕類場景效果顯著,是由于屏幕序列相比于攝像頭采集序列有很多重復性的圖案,用這個方法效果更好。
屏幕序列重復圖案示例
在屏幕內容中,像素點的選擇通常集中在某一些色彩上,所以我們引入了調色板模式。該模式徹底拋棄了傳統的變換編碼的方法,直接依據像素點的“顏色值”生成調色板。
對每個像素點,傳輸其在調色板中的“索引”(“index”)即可。該算法可以達到很高的編碼效率提升,同時這種方法由于不使用變換,且大多數的點可以在顏色表中找到對應的項,主觀質量也有明顯的提升。
YUV444編碼
在視頻編碼中,基本的數據格式為YUV,根據采樣格式的不同可以分為YUV444, YUV422以及YUV420,這三種格式的區別見下圖(O表示Y分量,X表示U/V分量):
YUV采樣格式 (左)YUV444 ?(中)YUV422 ?(右)YUV420
YUV444采樣格式中Y、U、V 三個分量的比例相同,每個像素的三個分量信息完整,都是一個字節。YUV422采樣格式中Y 分量和 UV 分量則按照 2 : 1 的比例采樣。如圖所示,水平方向有4個像素點,那么就采樣4個Y分量,2個UV 分量。
YUV420采樣格式中,每一行掃描時只掃描一種色度分量(U 或者 V)且該色度分量與Y分量按照 2 : 1 的方式采樣。如圖所示,為了直觀的理解,我們認為4個Y分量對應1個UV分量,因此將X放在了四個O中間。
一般來說,大多數的視頻類應用都采樣YUV420的格式進行編碼,一方面這種格式數據量較少,另一方面色度分量的重要程度明顯低于亮度分量,對色度降采樣后人眼主觀感受降低不明顯。
然而,在屏幕分享場景中,相比于攝像頭采集序列,U/V分量信息更豐富,下采樣會嚴重的丟失這部分信息,且在后續的后處理等環節無法補回,所以我們加入了YUV444編碼的支持。
大家可以看下下面這兩張圖,我們人為生成了一張U/V分量信息很豐富的圖片,在發送端可以看到是有色彩的,但是經過YUV420采集編碼傳輸后,到接收端看到的卻是一幅灰度圖像,失真非常嚴重。
測試圖片
YUV420傳輸效果(U/V分量嚴重失真)
在屏幕分享場景下,有些時候可能會對色彩的保真度/還原度要求較高,如一些設計圖像等,那么加入YUV444的支持就是為了在這些場景下達到不錯的用戶體驗。下面是我們實際測試到的YUV420/YUV444編碼下的對比圖:
原圖
YUV420編碼圖像
YUV444編碼圖像
五、業界領先的編碼器
我們對H.264和H.265編碼器進行了深度優化,一方面加入了很多快速算法,提升其編碼速度;另一方面加入了一些新的編碼工具集,提升其壓縮效率。
與業界最著名的x264開源編碼器相比,我們的H.264編碼器針對屏幕分享內容做了大量的優化,達到了40%以上壓縮效率的提升,編碼速度僅損失11%左右。
我們的H.265編碼器無論在屏幕分享場景還是攝像頭場景,都遠遠優于開源的x265編碼器。與x265相比,在屏幕分享場景下,壓縮效率提升多達83.7%,速度提升210%;在攝像頭場景下,壓縮效率提升24.7%的同時速度可以提升140%左右。
結語
本文較為詳細的介紹了一些騰訊會議中的視頻編碼“神器”,為了不斷地提升產品體驗,我們會根據不同的場景持續優化我們的編碼器,增加適合的編碼技術,歡迎大家咨詢體驗!
總結
以上是生活随笔為你收集整理的揭秘腾讯会议背后的视频编码“神器”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我在腾讯做运维--快速玩转蓝鲸社区版6.
- 下一篇: 突破领域边界,探索文创文保新趋势