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