2012 年 7 月,微信 4.2 版本首次加入了視頻通話功能,現在已發展了 5 年,在面對億級微信用戶複雜多變的網絡和設備環境,微信多媒體團隊在每一個技術細節上不斷地深耕細做,爲微信用戶提供了高質量的視頻通話。算法
今年騰訊全球合做夥伴大會上發佈的《2017 微信數據報告》顯示,到 2017 年 9 月,微信日成功通話次數 2.05 億次,月人均通話時長 139 分鐘,月人均通話次數 19 次。不管是通話次數仍是通話時長都比去年增長了一倍多,這個增加速度遠遠高於微信用戶量的增加,這與微信多媒體團隊在音視頻技術上的努力是分不開的。性能優化
本文將爲你們介紹微信視頻通話在不一樣發展階段的各個關鍵視頻技術環節採用的方案,同時分享在視頻通話中的視頻編碼器研發的方法和經驗。全文來自微信視頻技術負責人谷沉沉在 2017 北京 ArchSummit 全球架構師峯會上的演講內容。服務器
互聯網視頻通話的特色互聯網視頻應用的目標微信
與不少互聯網視頻應用相似,互聯網視頻通話的應用目標也是但願用盡量低的成本使視頻更加清晰與流暢。上圖右邊互聯網視頻應用的代價成本包含兩個維度:一是帶寬成本,包括客戶端用戶的流量成本,以及服務器端帶寬成本;二是計算資源開銷,表如今服務器端的設備投入量,以及客戶端的 CPU 佔用、耗電量等,而對於性能較差的客戶端設備,控制客戶端的計算資源還能夠保障這些設備也能支持基礎質量的視頻通話。網絡
視頻通話的技術挑戰架構
上圖中谷沉沉列舉了四類互聯網視頻應用,其中視頻通話應用相對於短視頻分享、流媒體直播和媒體存儲來講有三個特殊的挑戰:併發
第一,因爲微信視頻通話集中在移動端,這就要求系統的計算複雜度儘量低;app
第二,因爲視頻通話是高度實時的應用,決定了視頻數據通常採用不可靠傳輸,這就要求視頻傳輸具備必定的魯棒性,好比抗丟包的特性,另外,因爲沒有緩衝機制,視頻發送碼率要儘量平穩;框架
第三,因爲不少用戶在 3G、4G 等移動網絡下使用,對流量比較敏感,因此視頻通話帶寬佔用要儘量低。ide
最左邊三點是微信視頻通話做爲海量級用戶產品具備的特殊難點:用戶的網絡情況和設備性能差別巨大,因此微信視頻通話要適應不一樣的網絡和設備;因爲用戶版本更新存在必定的週期,這就須要考慮新技術對舊版本的兼容性;另外,海量併發用戶對服務器端形成的帶寬成本壓力也是必需要考慮的。
因此,互聯網視頻通話是各類互聯網視頻應用中約束條件最多、最苛刻,也是實現難度較大的一種互聯網視頻應用。
微信視頻通話基本技術框架
據谷沉沉透露,如今微信視頻通話是基於微信多媒體團隊自研的多媒體應用綜合引擎——WAVE (Wechat Audio&Video Engine)。該引擎的底層——內核層是由傳輸、視頻、音頻三大類跨平臺技術構成的。在此之上,針對不一樣應用類型的特色作了一些接口封裝和應用邏輯設計,造成應用層,目前支持三類不一樣的應用:第一類是實時通話應用,目前用於微信的點對點和多人視頻通話。第二類是多格式的圖片處理,主要用在微信朋友圈、公衆平臺以及表情等圖片的壓縮和處理上。第三類是音視頻文件壓縮,應用於朋友圈視頻、語音和視頻消息的壓縮和處理等。
通過多年的技術積累,WAVE 引擎支持了天天數億的視頻通話、數十億的視頻播放、數千億的圖片查看,因此整個引擎在壓縮效率、計算速度、音視頻質量等方面的性能都通過了微信億萬用戶的考驗,是業界比較領先的多媒體引擎。
谷沉沉表示他們團隊如今還在不斷提升引擎的處理速度、壓縮效率等性能,但願能用最合理的成本爲廣大用戶提供最好的多媒體體驗。
下圖是基於 WAVE 引擎的微信視頻通話系統,包含視頻、音頻、傳輸三大類技術,分佈在設備層、引擎層、服務器端三個層面。標紅的部分是視頻引擎涉及的技術。
下圖是 WAVE 微信視頻引擎的框圖,在發送端,攝像頭採集的原始視頻數據,一路直接在本地小窗口渲染,另外一路先通過視頻前處理,再進行視頻編碼,以後對編碼生成的碼流進行容錯保護,最後發送到網絡上。相應地,在接收端,對收到的碼流先進行錯誤恢復,對正確恢復的數據進行視頻解碼,然後經過後處理加強提高視頻質量,最後通過播放控制流暢地顯示在接收端屏幕主窗口上。
其中 QoS 的反饋模塊會收集接收視頻的質量、網絡情況等信息,經過服務器處理反饋到發送端,發送端再根據這些信息選擇合適的視頻編碼的參數,這樣就能實時適應不一樣的網絡情況。目前,不少網絡適配算法都是在 QoS 服務器上執行的,這樣,若是新算法發佈後發現問題,不用等到下一個客戶端版本的發佈,就能夠快速地在服務器端進行修改控制,加快算法的迭代進度。
視頻引擎的關鍵技術
上圖列出了視頻引擎中最關鍵的六大模塊的技術,其中最核心的是決定整個引擎基礎性能的視頻編解碼模塊,與之密切相關的有先後處理、容錯保護、網絡適配模塊,還有設備層的採集與顯示,以及對海量用戶通話狀況的評價和運營體系,這六個模塊技術協同配合,任何一個模塊的短板都會影響總體視頻通話質量。
在微信視頻通話版本發展的不一樣時期,這些技術模塊的發展也是各有側重,總體上大體經歷了三個階段:
第一階段是基礎框架的搭建和性能優化,2010-2012 年,第一個微信視頻通話發佈先後的這段時間,當時大部分主流移動設備 CPU 主頻只有單核 1GHz,爲了在這樣的設備上能流暢運行視頻通話,微信多媒體團隊在視頻編解碼速度優化上下了很大的功夫,當時優化後的編解碼速度在同等壓縮效率下已經達到了業界領先水平;在採集顯示環節也採用了快速、高質量的方案,並作了大量代碼流程優化以提升處理速度,如減小內存的拷貝,優化格式轉換流程等;因爲當時客戶端計算能力是整個視頻通話的瓶頸,視頻幀率、碼率較低,發送數據量對於大部分網絡不會形成太大壓力,因此第一階段的容錯保護策略很是簡單,只對關鍵幀作保護。通過這些基礎性能的優化,第一個微信視頻通話版本跟業界同類產品相比,同等帶寬下的視頻清晰度和流暢度都是很是不錯的。
第二階段是隨着移動設備硬件性能的逐漸提高,一些性能較好的移動設備能夠支持更高幀率的視頻通話,發送碼率也隨之增大,因而網絡適配策略就成爲這一階段的研發重點,因爲實驗模擬網絡環境與海量用戶真實的網絡環境老是存在差別,因此不少網絡適配算法在通過模擬環境下的驗證後,還必須進行線上灰度測試,一般會隨機抽取大量樣本作算法的對照實驗,若是在大規模樣本上新算法的各項技術指標均優於現網算法,纔會逐步放開到全部的通話。在這個灰度測試過程當中,海量用戶通話質量的評價運營體系也逐步創建和完善。
第三階段是在近兩年,移動設備性能大幅度地提高,不少 4 核 8 核手機的性能甚至比早些年的 PC 機都要好,設備的計算性能已經能夠支撐更高複雜度的計算,所以微信多媒體團隊開始研發視頻先後處理技術以提升主觀質量,同時在視頻編解碼上也加入了一些高複雜度、高壓縮效率的算法,使視頻通話在同等帶寬下能夠達到更高的視頻質量。
因爲演講時間所限,谷沉沉對選擇其中視頻編解碼、先後處理和容錯保護三個模塊進行了重點技術分析:
視頻編解碼 視頻編解碼的性能指標
在互聯網視頻應用中,視頻編解碼的核心指標歸納起來通常有三個:編碼效率、編解碼速度和傳輸適應性,而這些指標之間是相互制約的,編碼效率的提高每每是以犧牲編碼速度爲代價,傳輸適應性也會影響編碼效率,好比容錯保護時增長冗餘會致使編碼效率降低。因此一個好的視頻編解碼器須要在這些指標之間找到合理的平衡點。
這三個指標在視頻通話中具體須要關注哪些方面呢?
首先,在編碼效率上:
1)微信視頻通話的場景很是多樣,除了相似傳統視頻會議那樣總體內容比較靜止的場景外,還有不少運動劇烈的場景。可能不少人認爲微信視頻聊天一般都是手持手機攝像頭對着人臉,應該都屬於比較靜止的視頻場景,但在攝像頭距離人臉較近時,人臉在視頻畫面中佔據了較大部分,這樣人臉的一點輕微運動對於整個視頻來講已是屬於運動比較劇烈的內容場景,同時手持設備不穩定時還會形成視頻畫面的抖動,使運動更加複雜,所以微信視頻通話中的編碼算法必須適應多種不一樣的場景。
2)歷史版本互通兼容性,新的編碼技術必需要考慮舊版本的解碼兼容性,因此一旦編解碼格式肯定就不能頻繁更新,只有當技術積累到必定程度,壓縮效率有突破性的提高,纔會考慮升級替換。
3)主觀質量是「王道」,對互聯網應用來講,普通用戶不會關注 PSNR 等客觀質量指標,只會用眼睛來看,因此任何的客觀數據都只是技術上一種便捷的衡量方式,最終的衡量標準仍是人眼的主觀感覺。
其次,在編解碼速度方面,編解碼算法複雜度和實現優化程度都是影響編碼速度的重要因素。實現優化包括軟件的快速算法和代碼級優化,也包括硬件加速。隨着一代又一代的視頻編碼標準的發展,編碼效率的提高每每伴隨着算法複雜度的增長,CPU 難以支撐高複雜度的軟件編解碼計算,若是硬件視頻編解碼各方面性能能夠知足視頻通話的需求,利用硬件來加速視頻編解碼就能夠極大地緩解 CPU 計算資源壓力。此外,還要考慮幀級複雜度的均勻性,由於視頻通話能支持的最高幀率是由序列中編碼最慢的幀的時間消耗決定的。
第三,在傳輸適應性上,要求視頻碼流的碼率儘量平穩,更嚴格地,還要控制幀級瞬時數據量衝擊,以減小瞬時數據量衝擊形成網絡擁塞而出現丟包、延時等問題。此外,視頻碼流還須要具備必定的抗丟包能力。
如何打造一個優秀可靠的視頻 Codec?
谷沉沉根據多年的工做經驗,總結了打造一個優秀可靠的互聯網視頻應用軟件 Codec 的四個階段,針對其中第3、第四階段的優化,谷沉沉還舉了兩個微信多媒體團隊實戰優化過程當中的案例進行了具體說明:
第一階段是格式的確立,主要是根據應用的計算複雜度要求選擇合適的編碼標準格式,或者開發私有格式,這一階段主要考慮編碼效率,評價方式相似標準組織的通用測試條件。
第二階段是實現優化,主要是經過代碼優化和快速算法優化等提升編解碼速度,同時控制編碼效率損失,在知足應用要求的條件下,達到編碼效率和編解碼速度的合理平衡。
第三階段是應用定製,針對特定的應用場景需求作一些定製的研發,達到合入產品預發佈的要求。好比微信視頻通話中的碼率平穩性要求,以及編碼參數切換支持等,都是在這個階段經過碼率控制算法優化來實現的。
案例分享:碼率控制優化
碼率控制的難點是平衡碼率平穩性和壓縮效率、質量平穩性。雖然學術上有不少碼率控制的研究,但實際工程應用中仍是有不少問題須要考慮,如碼率控制的時間單位,極低幀率、極小 I 幀間隔下的碼率控制,單幀瞬時衝擊等。
上圖的第一張設置目標碼率 360kbps 的每秒數據量波動圖中,紫色線是微信自研視頻編解碼器的碼率波動狀況,能夠看出每秒的碼率基本都穩定在 360kb 左右,而藍色線表示的同等編碼效率下 x264 碼率波動狀況,在一些運動比較劇烈的場景,碼率會上升到 420kb,明顯高於目標碼率,這對咱們實時視頻通話應用就會有很大的衝擊。
雖然第一張圖中微信自研視頻編解碼器的每秒數據量波動已經很是平穩了,但第二張圖中紅色線表示的半秒數據量波動曲線仍是呈鋸齒狀,這在傳輸中依然會對網絡產生必定的衝擊,爲了進一步提高碼率平穩性,微信多媒體團隊又進行了第二輪更加嚴格的碼率控制優化,能夠看出綠線所示的現網微信視頻通話版本半秒數據量波動明顯比第二輪優化前的紅線平穩。
第四個階段是打磨穩定,雖然前面每一個階段都會對編解碼器進行編解碼匹配、編解碼各項指標性能等編解碼器離線測試驗證,但在合入產品應用後,尤爲是在海量用戶實際應用環境中,仍是會出現一些編解碼器離線測試時發現不了的問題,如主觀質量的缺陷問題,須要逐一分析儘量優化主觀質量,以及當解碼器接收到不能正常解碼的「髒」數據時,須要增強解碼器的魯棒性保護,及時終止解碼防止 crash 等。
案例分享:減輕塊效應
這裏谷沉沉分享了在微信視頻通話研發過程當中減輕塊效應的兩個優化方向:
一個優化方向是碼率分配微調。包含幀級和幀內兩個方面:幀級碼率分配微調是針對碼率平穩性優化形成運動劇烈場景下視頻質量損傷明顯的問題。所以在完成碼率控制算法以後須要根據主觀質量狀況對碼率分配作一些微調,適當增長運動劇烈場景下碼率分配以提升質量;幀內率分配微調是指,因爲人眼對平坦區域更加敏感,因此也會多爲平坦區域多分配一些碼率。在上面這個視頻中,左面是優化以前,右面是優化以後,在運動劇烈場景中,如揮手的時候,手的部位較平坦區域塊效應明顯減輕。
另外一個優化方向是編碼模式的微調。這裏谷沉沉又舉了兩個例子:
一是關於 skip 模式的斷定,上圖左下角解碼視頻截圖中臉部標紅圈的地方出現比較明顯的塊效應問題,通過分析發現這個視頻中相鄰的這兩幀在這個位置上內容類似,編碼過程當中基於率失真最優原則的模式選擇結果是採用 skip 模式編碼,簡單說就是直接拷貝前一幀中相應的像素塊,雖然在客觀編碼效率上是當前塊最優的編碼模式,但主觀質量上塊效應比較明顯,微信多媒體團隊對 skip 模式的判斷條件作了一些微調,將這種狀況改用 inter 模式編碼,多留一些殘差信息,雖然這個位置「花費」的比特數比 skip 模式多一點,但失真度也會低一些,圖中右面通過調整以後這個位置基本看不出塊效應。
另外一種編碼模式的微調是 intra 和 inter 模式的選擇,當 intra 和 inter 模式編碼的率失真代價比較接近,採用哪一種模式編碼對客觀編碼效率影響很小。可是在主觀質量上,有時候 inter 模式的殘差較小,量化以後一部分小系數的丟失也容易形成塊效應,這個時候針對這些場景利用一些輔助的統計信息,將這種場景斷定爲 intra 模式編碼就能解決這類塊效應問題。
先後處理
先後處理的加強效果毋庸置疑,但在不少場景下「反作用」也比較大,好比去噪容易形成細節模糊甚至缺失,銳化可能帶來鋸齒效應……所以研究先後處理算法的關鍵是要消除「反作用」,微信多媒體團隊就是按照「寧缺毋濫」的原則,即每次先後處理算法的更新能夠只對部分場景加強,加強的幅度也能夠較小,但必須保證不會出現質量變差的場景。在算法研究階段須要設計好場景自適應策略,對於算法沒法徹底解決的狀況,再輔以運營策略,好比「白名單、黑名單」機制,對特定型號設備開啓或關閉相應的算法等。
案例分享:光照加強
光照加強問題的發現來源於微信多媒體團隊的一次視頻通話測試體驗,在晚上室內日光燈環境下,不一樣手機攝像頭採集的視頻質量差別較大,有些手機的採集視頻與真實環境光照基本一致,而有些手機採集的視頻就偏暗,甚至連人臉都沒法看清。針對這種狀況,微信多媒體團隊自主研究了一種低照度視頻加強方法,先經過對單幀平均亮度和最大、最小亮度等信息的分析和統計,推導出單幀的亮度加強和對比度加強的自適應約束;爲避免視頻連續播放出現亮度閃爍,算法還考慮了先後幀亮度變化的一致性約束;最後對三個方面的約束作聯合優化求解,因爲優化項中只包含二次項,再進行快速算法實現優化,求解過程計算複雜度較低,所以整個光照加強技術能夠在視頻通話中實時處理。
上圖左上角子圖 (a) 爲低光照的輸入源視頻截圖,(f) 爲微信自研光照加強算法處理後的視頻截圖,加強後可見臉部更多細節和背景環境的紋理,而從其他幾個現有視頻圖像加強對照算法處理後的截圖中,能夠看出存在不一樣程度的顏色異常或加強效果不明顯等問題。
這項實用的研究成果在應用於微信視頻通話有效提高視頻質量的同時,也獲得了學術界的高度承認。該算法相關的論文已發表在國際視頻領域知名會議 ISCAS2017 上,並受邀在大會上宣講,也是該次會議上僅有 5% 來自工業界的論文之一。感興趣的讀者可參考《Low-Lighting Video Enhancement Using Constrained Spatial-Temporal Model for Real-Time Mobile Communication》, IEEE ISCAS, pp:595-598, 2017
容錯保護
容錯保護每每經過增長冗餘來實現,而視頻編碼又是經過下降冗餘來提升壓縮效率,因此容錯保護的關鍵是要作到壓縮效率和容錯能力的平衡。主要有信源容錯和信道容錯兩類方法:
信源容錯能夠經過改變參考關係,好比上圖裏 IPPP 這樣依次參考的結構,若是 P4 這幀丟失了,後面從 P5 開始全部幀都沒法正常解碼,在視頻通話中就表現爲卡住。但若是改變參考關係,讓 P5 參考 P3,這樣 P4 雖然丟失了,可是 P5 和後面的幀都還能夠正常解碼,這就是一種抗丟包能力。因爲 P5 的參考幀距離變遠了,相關性比 P5 和 P4 之間的相關性弱,P5 的數據量就會增大,壓縮效率就會下降,這就是這種容錯方式所帶來的時域冗餘代價。咱們須要在容錯能力和冗餘代價上取得較好的平衡,在應用中也能夠根據網絡情況選擇合適的冗餘能力。
信道容錯的方法有信源容錯能夠經過改變參考關係來提升在丟包環境下的視頻解碼正確率,如上圖中 IPPP 參考幀結構,若 P4 幀丟失了,其後從 P5 開始的全部幀都沒法正常解碼,在視頻通話中就表現爲卡住。但若是改變參考關係,使 P5 參考 P3,這樣,P4 的丟失就不影響 P5 及其後續幀的正常解碼。但因爲此時 P5 的參考幀距離變大,可能形成 P5 的幀間預測準確性降低,致使 P5 編碼數據量增大,壓縮效率下降,這就是這種容錯方式所帶來的時域冗餘代價。所以須要在容錯能力和冗餘代價上取得較好的平衡,在應用中也能夠根據網絡情況選擇合適的容錯能力。
在信道容錯方面,有分組異或、RS 編碼等 FEC 前向糾錯技術。能夠根據每一幀的重要性等級增長不一樣的冗餘保護,上圖中紅色越深的幀表示重要性越高,它的丟失會形成更多幀解碼失敗,能夠對這些越重要的幀增長越多的冗餘保護。另外,對低延時網絡,若是遇到丟包致使解碼失敗,能夠向發送端主動請求編碼 I 幀,避免長時間的卡頓。
將來之路
談到將來,谷沉沉表示互聯網時代業務和技術突飛猛進,在不太遠的將來幾年內,視頻技術的發展方向大體有三類:
1)基礎技術的突破,如 H.26六、AVS三、AV1 等下一代標準,以及最近的熱點研究方向——基於深度學習的視頻圖像壓縮,壓縮效率將進一步提升。
2)現有視頻產品的體驗提高,繼續向着高質量、低帶寬 / 存儲空間、低功耗的方向發展。
3)新的產品形態不斷出現,好比 3D、VR 甚至光場等沉浸式的視頻通話。
將來,微信多媒體團隊將繼續堅持以專業、專一的精神,研發實用的多媒體技術,也歡迎對視頻圖像技術感興趣的優秀人才加入或開展技術研究合做,一塊兒來不斷提高數億用戶的微信視頻通話等各種視頻圖像相關業務體驗!