騰訊多媒體實驗室:視頻編碼技術在多場景下的應用實踐
大家好,首先感謝TLC大會組委會的邀請,有這個機會在這里跟大家一起交流分享。我先做個簡單的自我介紹。我叫王詩濤,目前就職于騰訊多媒體實驗室,我的主要研究方向是視頻編解碼和圖像壓縮。我是2013年入職騰訊,先后負責 QQ視頻通話,騰訊云互動直播SDK,騰訊會議和云游戲等實時音視頻場景下的視頻技術開發,同時我也負責圖片壓縮技術的研發,主導開發了TPG圖片壓縮格式。
本文引用地址:http://www.104case.com/article/202009/418708.htm今天我給大家分享的主要內容分為三大部分,第一部分是騰訊會議的視頻編碼技術優化介紹。第二部分是介紹我們將視頻編碼用于圖像壓縮的探索實踐。最后一部分會介紹我們近兩年在云游戲場景上面的一些視頻編碼技術的優化。
1. 騰訊會議視頻編碼技術攻堅戰
首先我們來看我們在騰訊會議上做的一些視頻技術優化,2020年,對大家來講是一個很不平凡的一年,這一年因為疫情的爆發,改變了大家的工作和生活方式,也正是因為疫情讓騰訊會議這一款產品備受關注,成為了爆款。其實騰訊會議推出的時間并不長,我們是在2019年底的時候才發布這款產品,發布不到一個月,疫情就爆發了。我記得我們發布之初的DAU才幾千人,疫情爆發之后,不到兩個月的時間DAU就突破了1000萬。因為用戶的爆炸式增長導致我們的流量帶寬也呈現指數級增長,為了節省帶寬成本,我們在視頻編碼這一塊做了大量的優化。
1.1 H.265編碼技術優化
首先就是優化H.265編碼技術。我們知道現在主流的視頻編碼格式是H.264和H.265, H.265比H.264的壓縮效率要高50%左右,但是它的編碼復雜度也會比H.264高很多。如果要在騰訊會議這種實時場景下應用的話,肯定是要做大量的性能優化的。我們對編碼算法的各個模塊,比如說塊劃分,幀內幀間預測等都做了大量的算法優化,包括模式選擇快速算法和提前退出算法,同時也做了很多工程類優化。比如說優化數據結構,減少內存拷貝,匯編優化以及多線程優化等。經過優化之后,我們的編碼器相比于開源的X265,無論是在壓縮效率,還是在編碼速度方面都是有很大的優勢的。我們的編碼速度比X265-Ultrafast還要快一倍以上,同時壓縮效率高30%以上。



1.2 攝像頭視頻場景下的編碼優化
除了編碼內核優化,我們也針對視頻會議這個場景做了很多專項優化,第一個是ROI編碼,ROI編碼也叫感興趣區域編碼,對于會議里面的攝像頭視頻,大家可能更關注的是人臉區域,而對背景區域關注度較低。所以我們采用ROI編碼來提升人臉區域清晰度,提升主觀質量。ROI編碼包含兩個模塊,一塊是人臉檢測,或者說膚色監測,另外一塊是ROI編碼。對于人臉檢測模塊,我們采用了快速高效的檢測算法,每幀1080p圖像的檢測耗時可以控制在0.3ms以內,對整體編碼性能影響非常小。完成人臉檢測之后,我們會在編碼前對碼率控制進行調整,對于ROI區域增加碼率,提升編碼質量,對于非ROI區域則適當降低碼率,以保持總體碼率的平衡。我們的ROI編碼效果是非常明顯的,在低碼率下可以明顯提升視頻主觀質量,高碼率下可以節省20%以上碼率,同時保持主觀質量基本不變。
除了通過ROI提升編碼效果,我們也在提升視頻網絡抗性方面做了很多工作。比如SVC編碼技術。通常視頻會議是多方接入的,參會人可能有三五人甚至更多,每個接入用戶的網絡狀態是不一樣的,有的用戶網絡好,有的網絡狀況很差,這就給編碼端帶來了難題,如果發送端為了確保網絡差的用戶能正常通信而發送一個低碼率視頻,就會影響到網絡好的用戶的視頻體驗,而如果為了保證網絡好用戶的視頻效果發送高清視頻的話,網絡差的用戶的視頻就會卡死。

為了解決這個問題,我們在編碼端采用了SVC編碼技術。我們將編碼視頻分成三層,其中基本層只能參考基本層,增強層可以參考基本層也可以參考增強層,這樣的話,只要基本層不丟失,那所有的基本層的視頻幀都能正確解碼,不需要申請I幀。這樣做的好處是,對于網絡很差的用戶,我們只給他下發基本層碼流就可以了,保證他的基本通信,而對于網絡好的用戶,我們會下發所有層,確保用戶能夠享受到高清流暢的視頻體驗。SVC編碼技術很好的適配了各種網絡狀況的用戶,避免了一個接收端的網絡不好影響到其他接收端的視頻效果。
1.3 屏幕分享場景下的編碼優化
前面介紹的是我們在攝像頭視頻這個場景上做的一些優化,接下來我再介紹一下我們在屏幕分享這個場景上面的一些優化。屏幕分享是視頻會議的一個主流場景,屏幕分享的內容是計算機生成的屏幕圖像,屏幕圖像和我們用攝像頭采集的視頻,是有很大的不同的。比如說屏幕內容圖像通常是沒有噪聲,色調比較離散,線條比較細膩,而傳統的攝像頭視頻是有噪聲,色調連續的,而且紋理通常比較復雜。
傳統的視頻編碼技術采用的預測+變換的混合編碼結構,它主要針對的是攝像頭視頻,而對于屏幕內容,它的壓縮效率是不太高的,經過變換編碼后,很多高頻分量會損失,導致細節丟失、為了提升屏幕內容的編碼效率,HEVC在16年的時候專門推出了一個針對屏幕內容編碼的檔次,叫HEVC-SCC。SCC極大的提升了屏幕分享這種場景下的編碼效率。
SCC里面有兩個關鍵技術,一個是幀內塊拷貝技術,也叫IBC編碼,IBC編碼的時候,可以用當前幀已經重建好的塊作為參考塊,也就是基于當前幀的運動補償。另一個技術是調色板編碼(Palette Mode)技術,調色板編碼利用顏色表和顏色索引來完成每個像素的重建。IBC和Palette編碼對于屏幕內容的壓縮效率的提升效果非常顯著,壓縮效率相比H.265可以提升50%以上。為了提升屏幕分享場景下的壓縮效率,我們在原有編碼器基礎上加入了這兩個工具集,推出了一個專用于屏幕內容壓縮的TSE編碼器。


IBC和Palette編碼雖然壓縮效率很高,但是編碼復雜度也是挺高的,為了能在視頻會議這種實時場景應用,我們對TSE編碼器做了大量的性能優化工作,比如基于hash的運動估計,快速顏色表生成及查找算法,提前退出算法以及匯編優化等。經過優化之后,我們的TSE編碼器的總體性能達到了業界領先的水平。我們這里有組對比數據,編碼效率方面,我們的TSE編碼器比X265-Ultrafast高70%以上,編碼速度不到X265-Ultrafast的一半。除了客觀質量方面的提升,TSE對主觀質量的改善也是很明顯的,采用TSE編碼生成的圖像,文字效果要明顯好于X265的編碼效果,另外,TSE編碼輸出的圖像的線條也更加的清晰細膩。
除了屏幕內容編碼技術,我們在屏幕內容的編碼方面,還增加了YUV444編碼模式的支持。由于人眼對色度分量不太敏感,通常攝像頭視頻一般會在編碼前對色度分量進行一個下采樣,編碼的時候采用YUV420格式,這樣可以節省帶寬,同時整體的主觀質量影響不大。但是對于屏幕內容序列,因為本身它的色彩是非常豐富的,如果我們對色度分量進行下采樣的話,會嚴重影響圖像的重建效果。而且這種損失是不可逆的,它沒法通過后面的編解碼環節補償回來。為了解決色度下采樣帶來的顏色失真問題,我們支持了YUV444編碼模式,YUV444編碼由于沒有色度下采樣,它編碼之后的圖像視覺質量和原圖非常接近。相比于YUV420編碼,主觀質量有很大提升。
2. 視頻編碼在圖像壓縮領域的探索實踐
前面介紹了我們實驗室在視頻會議這個場景上面的一些視頻編碼技術的優化,接下來第二部分我將介紹一下我們在圖片壓縮這一塊的一些探索實踐。
我們在前幾年的時候推出了一個名為TPG的圖片壓縮格式,它是一個基于avs2的圖片壓縮格式,我先簡單介紹一下我們TPG格式產生的背景。我們早在14年、15年的時候,就開始了圖片壓縮的優化工作。當時收到很多業務的反饋說圖片的流量帶寬成本比較大,看我們能不能幫忙節省圖片帶寬流量成本。當時互聯網行業用的比較多的圖片格式是jpeg和webp,jpeg是一個很古老的格式,它的壓縮效率是比較低的,webp是谷歌在10年左右推出的一個基于VP8的圖片編碼格式。
我們當時就想,VP8是和H264同一時代的標準,既然可以用VP8來做圖像壓縮,那為什么不用最新的H.265編碼標準呢,為了驗證H.265方案的可行性,我們做了大量實驗,發現采用H.265進行圖像壓縮,其壓縮效率要遠遠高于jpeg,也大幅領先于webp,也就是說采用H.265進行圖片壓縮是完全可行的。考慮到H.265的專利風險性,我們就采用了壓縮效率和H.265相當的AVS2作為內核,推出了TPG圖片壓縮格式。
我們的TPG圖片編碼系統包括RGB轉YUV模塊,編碼模塊,TPG格式封裝幾個模塊。為了支持一些圖片特有信息,我們的TPG加入了很多功能擴展。比如對Alpha通道的支持,傳統的視頻編碼是沒法編碼RGBA數據的,為了能夠加入Alpha通道信息,我們將RGBA數據分離成RGB數據和Alpha數據,然后將兩個通道的數據分別進行編碼,最后將編碼后的數據合成在一起輸出一個TPG碼流。還有就是對于動態圖片格式的支持,我們知道傳統的gif圖像編碼由于沒有利用圖像之間的相關性信息,它的壓縮效率是很低的,我們的TPG采用視頻編碼的模式對動圖進行壓縮,在保持主觀質量基本不變的情況下,編碼效率大大提升,同時,為了和gif保持特性一致,我們在TPG里面加入了顏色表、延遲時間等信息,確保TPG的圖片展示效果和gif完全一致。

經過不斷完善,TPG格式的功能不斷健全,壓縮效率優勢明顯,根據我們的對比測試結果,在同等主觀質量下,TPG的壓縮效率比jpeg高45%以上,比png高60%以上,比gif高85%以上。
我們除了優化TPG編碼內核提升壓縮效率,也實現了一整套TPG轉碼方案。在h5頁面接入方面,我們和公司內的X5內核團隊合作,推出了一個CDN+X5內核的無痛接入方案,X5內核里面原生支持我們的TPG格式,在請求圖片的時候,請求頭里面會帶上image/tpg標識,只要業務是用的X5內核,業務上層不需要做任何改造就可以輕松接入TPG圖片格式;在騰訊云開發接入方面,騰訊云數據萬象和微信小程序內核已集成TPG的轉碼方案,接入云開發就直接使用TPG格式;除了H5接入和騰訊云開發的方案,我們也實現了終端native接入的方案,提供全平臺的TPG解碼器,業務只要集成了我們的解碼器,就可以解碼出RGB數據,之后完成渲染。
在服務端,當用戶請求圖片的時候,首先會判斷終端是否支持TPG,如果支持TPG的話,就看OC節點是否有TPG緩存,有緩存就下發TPG,否則回源查看是否有 TPG副本,如果有就緩存到OC節點下發TPG,否則啟動TPG的轉碼同時下發原圖。
前面介紹了我們TPG格式的一些特性以及轉碼方案,這里總結一下TPG的優勢。首先它的壓縮效率高,相比jpeg,png和gif優勢明顯;TPG有完整的解決方案,支持CDN+X5內核的H5接入和終端native SDK接入,支持linux、windows,mac,ios,android全平臺,另外為了支持瀏覽器,我們也推出了TPG的js版解碼器;功能方面,TPG增加了對alpha通道和動畫的支持。
正是由于TPG有這么多的優點,TPG格式推出后,在公司內外得到了廣泛的應用。目前公司內已經有超過60家業務接入了我們的TPG圖片格式。我們可以看下業務接入TPG格式后的效果對比。以手Q H5頁面為例,采用tpg圖片格式后,手Q H5頁面的流量節省了50%以上,除了帶來流量的節省,TPG在體驗優化這一塊的效果也是比較明顯的。這里有一組業務的頁面測試數據,采用TPG格式后,頁面的總圖片大小,減少了近50%,同時頁面加載速度提升了近1/3。

為了在行業內進一步推廣TPG格式,我們也做了TPG的標準化工作,我們在17年的時候向AVS組織提出了建立互聯網圖像標準的提案,并且成功將TPG納入AVS2的第7部分圖像容器,目前AVS2-P7已經在國家標準的申報流程中,相信在不久的將來就會正式發布為國家標準。
3. 云游戲場景下編碼技術優化
前面介紹的是我們在會議和圖片壓縮場景的一些技術優化,最后一部分我會介紹一下我們在云游戲場景下的一些研究。
首先簡單介紹下什么是云游戲?云游戲是一種以云計算和串流技術為基礎的一個在線游戲技術,它將游戲渲染放到了服務器端,而不是在用戶的終端設備上進行本地渲染。云游戲把游戲玩家的操作指令直接發送到云端,由云端來完成圖像渲染,渲染后的圖像會被編碼成一個視頻流,然后把這個視頻流發到用戶的手機或者終端設備上面,完成解碼顯示。也就是在玩游戲的時候,其實你看到的是一個視頻,由于視頻編碼質量高,延時小,所以效果和本地渲染看起來一樣。

云游戲有什么好處呢?首先,云游戲即開即玩,不需要下載。以前我們玩一個游戲,比如lol或者王者榮耀,我們需要先去下載一個安裝包,而安裝包一般比較大,這樣既浪費用戶時間,也占用設備存儲空間。以前試玩一個游戲的成本比較高,現在的話,我可以隨時隨地打開就玩,輕松體驗各種游戲。
其次,本地游戲需要在本地渲染,對游戲玩家的硬件設備配置要求比較高,采用云游戲后,將渲染搬到云端,對用戶的終端設備的配置要求會大大的降低,以前為了玩一個重度游戲,需要去網吧,現在在家用一個普通筆記本,就可以在上面輕松的玩各種大型游戲。
還有一點,云游戲解決了跨平臺兼容的問題。現在MAC電腦的用戶越來越多,但是很多游戲是不支持MAC平臺的。云游戲采用的視頻流方案,解決了各平臺終端互通的問題,MAC,手機甚至TV都可以玩端游。
云游戲有這么多好處,為什么之前一直沒有發展起來呢?這里簡單介紹下云游戲發展歷史。云游戲的概念在2000年左右的時候就提出來了。2009年OnLine公司推出了第一款云游戲孤島危機,接下來的近10年的時間里面,云游戲發展比較緩慢。從2018年開始,云游戲進入了快速發展時期,各大巨頭開始發力, Google微軟都推出了自己的云游戲,在騰訊內部也有好幾個云游戲團隊,比如 start云游戲,GameMatrix,騰訊即玩,騰訊云也推出了云游戲解決方案。

為什么近兩年云游戲發展突然加速了呢?我覺得主要有以下幾個方面的原因,一個是云計算的普及以及邊緣計算的發展,包括我們GPU虛擬化技術的成熟。另一個關鍵原因是隨著5G時代的到來,用戶的網絡帶寬越來越好,而且帶寬成本越來越低,可以很好的滿足云游戲對于高帶寬的要求;還有就是我們的音視頻技術的不斷發展,現在硬件編解碼技術越來越成熟了,而且壓縮效率越來越高,為云游戲的發展提供了支撐。
云游戲它有幾大模塊,一塊是在云端,云端主要是負責渲染和編碼,第二大模塊網絡傳輸,然后再加上終端的解碼渲染過程,音視頻編解碼技術在云游戲里面是一個比較核心的模塊,云游戲的圖像壓縮質量,帶寬成本,游戲時延等均和編解碼技術息息相關,為了提升云游戲用戶體驗,我們聯合公司內的云游戲團隊,一起針對云游戲場景做了大量視頻技術優化,我們也自研了一套云游戲視頻引擎。
我們的云游戲引擎采用了全鏈路硬件的實現方案。在云端編碼這塊,我們采用H.265編碼來提升壓縮效率,支持DX紋理輸入,避免CPU和GPU之間大量的數據拷貝。為了節省流量帶寬,我們在編碼策略這一塊做了大量的優化,比如說采用動態碼率,我們會在編碼前對視頻場景進行預分析,如果當前畫面屬于比較靜止的場景,我們會適當降低它的碼率,因為靜止場景通常圖像的PSNR比較高,比如在45dB以上,對于這類圖像,即使降低部分碼率,人眼一般感覺不出來。
而對于復雜運動區域,則會適當的提升碼率,這樣可以改善大運動場景下畫面模糊的問題。采用動態碼率技術,不但能夠節省碼率,視頻主觀質量還能得到一定提升。除了動態碼率,我們還加入了一些視頻前處理技術比如視頻增強來提升主觀質量。另外,我們也使用了ROI編碼技術,可以在主觀質量基本不變的情況下,節省10%左右的碼率。

客戶端方面,我們windows、mac、ios、android全平臺支持了H.264、H.265 1080p@60fps硬件解碼,并針對各平臺的解碼性能做了大量優化。比如針對Android硬件解碼兼容性差,延時大等問題,我們通過優化解碼出幀機制,處理囤幀問題降低延時,針對不同芯片下發不同配置參數,挖掘最大潛能,同時完善我們的硬件能力檢測機制,盡可能覆蓋更多機型。
同時,我們也做了解碼渲染一體化工作,避免GPU和CPU的數據拷貝,提升性能。另外,我們也加入了客戶端能力上報,異常監測機制,云端和客戶端能力協商機制,根據客戶端反饋動態調整編碼策略。

經過優化之后,我們的云游戲視頻引擎整體性能達到了業界領先水平。我們的采集+編碼整體耗時控制在5ms以內,客戶端的解碼+渲染的總耗時,windows平臺在5ms以內,MAC在8ms左右,Android手機的平均耗時在12ms左右,我們整體的端到端延時已經做到了行業內最低。
目前我們的云游戲視頻方案已經在公司內最大的云游戲平臺START全平臺上線,支持了PC,移動和TV端,目前可以做到玩云游戲與玩本地游戲在體驗上已經沒有差別了。
以上就是我這次分享的主要內容,謝謝大家!
評論