編風(fēng)網(wǎng)沙龍.精彩內(nèi)幕 | 騰訊音視頻傳輸技術(shù)解密(上)

我們來到了一個新世紀(jì)觉鼻,屬于音視頻的世紀(jì)俊扭,很高興大家選對了方向,站在了音視頻的風(fēng)口上坠陈。移動網(wǎng)絡(luò)的快速發(fā)展萨惑,音視頻必然成為更方便快捷的溝通方式。就像十幾年前的互聯(lián)網(wǎng)仇矾,有一天庸蔼,音視頻也會成為一項基礎(chǔ)服務(wù),極大地改變我們的生活方式贮匕。

自我介紹一下吧姐仅,我叫伍倡輝,07年入職騰訊刻盐,做過大數(shù)據(jù)分析掏膏、兩人音視頻系統(tǒng)、多人音視頻系統(tǒng)敦锌、PSTN以及直播系統(tǒng)馒疹,目前為直播系統(tǒng)總架構(gòu)師。這次主要分享騰訊在做音視頻時的一些相關(guān)技術(shù)乙墙,不是炫耀騰訊技術(shù)多牛逼颖变,而是來相互學(xué)習(xí),打造行業(yè)技術(shù)氛圍听想。

獨立日2里腥刹,男女主角用QQ實現(xiàn)地月通話,且不說植入廣告是否欠維和哗魂,QQ能上好萊塢大片肛走,我個人還是覺得很自豪的。為什么QQ音視頻能上月录别?有人說這個是通信商解決的問題朽色,只要網(wǎng)絡(luò)通了就行,其實還真跟音視頻技術(shù)有一些關(guān)系组题,比如距離遠(yuǎn)了之后葫男,時延、丟包率都會大很多崔列,怎么處理好是有挑戰(zhàn)的梢褐。這些都是我們自己心里YY旺遮,現(xiàn)在來看看做2人音視頻都需要哪些技術(shù)吧。

電影里的場景盈咳,就是男主角要跟女友視頻聊天耿眉。

從技術(shù)層面表達(dá),就是把上行方攝像頭里實時采集的畫面鱼响,一幀一幀傳到對方鸣剪,在顯示器上展示,再把上行方麥克風(fēng)里的聲波丈积,采集傳到對方筐骇,在外放或耳機(jī)里播放。事情聽起來很簡單江滨,我們來看看騰訊都做了啥铛纬。

這是騰訊兩人音視頻的基本架構(gòu),其中任何一塊唬滑,都可以作為一個課題告唆,深入研究。

視頻间雀,我們可以采集攝像頭悔详、屏幕等畫面,做降噪惹挟、縮放等前處理,進(jìn)入編碼缝驳。音頻可以通過麥克風(fēng)连锯、或HOOK系統(tǒng)獲取系統(tǒng)聲音,等等用狱,做降噪运怖、回聲抵消、自動增益等前處理夏伊,進(jìn)入編碼摇展。編碼最主要的算法就是DCT變換,損失掉一些人感知弱的部分溺忧,然后經(jīng)過網(wǎng)絡(luò)傳輸咏连。網(wǎng)絡(luò)傳輸主要有直連打洞、中轉(zhuǎn)鲁森、路由管理等模塊祟滴。下行客戶端主要就是上行客戶端的逆過程。

騰訊2人音視頻歌溉,每天傳輸量約1P左右垄懂。為了方便直觀的感受一下,如果是DVD,估計需要21萬張來存儲草慧。

所以桶蛔,我們首先要考慮的是壓縮傳輸。就是用編碼器來將原始數(shù)據(jù)壓縮漫谷,例如H264羽圃、silk等等,這些都是壓縮算法抖剿。壓縮算法本身朽寞,我們并沒有深入研究,這些在一些專門做編解碼算法公司里面斩郎,已經(jīng)快做到極致了脑融,我們主要是對其中的參數(shù)做一些適配,作一些優(yōu)缺點互補(bǔ)缩宜。

即使壓縮傳輸肘迎,一路視頻也需要幾百k或幾兆流量。我們服務(wù)器帶寬成本锻煌,為幾萬1G妓布,成本很高,所以必須考慮直連宋梧。WebRTC里面的直連打洞做得已經(jīng)很不錯了匣沼。騰訊的打洞過程也是參考的WebRTC,做了一些小優(yōu)化捂龄,例如用戶和就近同運營商的打洞服務(wù)器相連释涛,打洞服務(wù)器雙機(jī)走專線提供服務(wù),可以讓用戶連接打洞服務(wù)器的成功率更高倦沧。

大家都知道唇撬,NAT并不能都成功,或者直連成功了展融,直連網(wǎng)絡(luò)也可能很差窖认。因此必須要有中轉(zhuǎn),那就涉及到多通道的管理上了告希。騰訊有直連扑浸、單中轉(zhuǎn)、雙中轉(zhuǎn)暂雹、動態(tài)路由等通道首装,能通過歷史情況自我學(xué)習(xí),再配合現(xiàn)有具體情況靈活控制杭跪。

中轉(zhuǎn)機(jī)器部署會很廣泛仙逻,機(jī)器量非常龐大驰吓,必然涉及到海量集群的機(jī)器管理。我們不能全依賴人工解決所有服務(wù)器問題系奉,要考慮容災(zāi)檬贰、柔性、灰度發(fā)布缺亮、負(fù)載均衡翁涤、就近調(diào)度等等。

用戶的網(wǎng)絡(luò)萌踱,什么情況都有葵礼,不是我們能控制的。怎么樣才能合理的并鸵,盡可能的利用用戶帶寬鸳粉,就涉及到帶寬預(yù)測。

即使帶寬曲線模擬得再好园担,不代表網(wǎng)絡(luò)不丟包届谈。為了減少延時,我們音視頻傳輸用的都是UDP弯汰,丟包不能影響音視頻使用艰山,所以怎么抗丟包而由延時小就顯得很關(guān)鍵。

前兩項咏闪,業(yè)界有很多文章曙搬,技術(shù)也都比較成熟,這里就不細(xì)講汤踏。第三項织鲸,是一些慢工細(xì)活,暫時不講溪胶,這次主要講一下后面有騰訊特色的三項技術(shù)。

騰訊的接入點稳诚,在全球都有很多點哗脖。這么多的機(jī)器怎么管理呢?這里主要介紹一下騰訊經(jīng)典的負(fù)載均衡算法扳还。上一周才避,我面試了一個人,他做的系統(tǒng)氨距,用的是最小分配算法桑逝,系統(tǒng)跑得很好,因為請求量不大俏让,只是機(jī)器利用率低一點而已楞遏,浪費也不大茬暇。然而在騰訊,服務(wù)是海量的寡喝,再用這種算法就會出問題了糙俗。

這是一個典型的案例。在做群視頻的時候预鬓,有新同事誤用最小分配算法實現(xiàn)負(fù)載均衡巧骚,結(jié)果所有單機(jī)負(fù)載出現(xiàn)了鋸齒狀的曲線,后來改為騰訊經(jīng)典的加權(quán)隨機(jī)負(fù)載均衡算法格二,曲線就平滑多了劈彪。最小分配為什么會出現(xiàn)鋸齒狀曲線?是因為調(diào)度系統(tǒng)的單機(jī)負(fù)載顶猜,并不是每次用戶接入或退出就實時更新沧奴,而是集群機(jī)器定時統(tǒng)計上報。前者會使得系統(tǒng)耦合度很高驶兜,后者實現(xiàn)更簡單扼仲。在一個上報周期中,調(diào)度系統(tǒng)里記錄的單機(jī)負(fù)載不會變抄淑。所有請求都會分配到這個周期里負(fù)載最低的機(jī)器上屠凶。導(dǎo)致單機(jī)負(fù)載突然暴漲,變成負(fù)載最高的機(jī)器肆资。然后在未來若干個周期中都不會分配矗愧,等待用戶自然流失。跌到最低點時又會再分配郑原。

騰訊經(jīng)典的負(fù)載均衡算法唉韭,在每次機(jī)器負(fù)載上報時,會計算每臺機(jī)器的空余度犯犁,然后將所有空余度加起來属愤,例如這里總和為37。

每次用戶請求酸役,計算一個1到37之間的隨機(jī)數(shù)住诸,這個隨機(jī)數(shù)屬于哪臺機(jī)器,就選哪臺機(jī)器涣澡。例如這里的隨機(jī)數(shù)為18贱呐,就選第4臺機(jī)器。

這種算法入桂,實現(xiàn)簡單奄薇,處理用戶請求部分只需要幾行代碼就搞定了:算一個隨機(jī)數(shù)模總空余度抗愁,逐臺機(jī)器減空余度馁蒂,減到哪臺小于0呵晚,就選哪臺。效率也很高远搪,時間復(fù)雜度不到n劣纲。分配上,負(fù)載輕的谁鳍,分配概率大癞季,負(fù)載重的,分配概率小倘潜。從單次分配來看绷柒,有概率可能分配到負(fù)載較重的機(jī)器。但從宏觀統(tǒng)計看涮因,整體負(fù)載會比較平均废睦。如果新增加一臺機(jī)器,新機(jī)器的負(fù)載增加也會是比較平滑的养泡,而不是突然達(dá)到負(fù)載平衡點嗜湃。

騰訊經(jīng)典的負(fù)載均衡算法,一般會和其他算法配合澜掩,例如就近购披、容災(zāi)等〖玳牛可以通過權(quán)值控制就近接入刚陡,使得就近機(jī)器分配概率比別的機(jī)器大,這樣如果某地機(jī)器全部故障(例如IDC停電株汉、專線被挖)筐乳,或負(fù)載滿,可以自動就近調(diào)度到其他接入點乔妈,而不需要人工干預(yù)蝙云。機(jī)器故障,也會調(diào)整權(quán)值路召,使得分配概率極小贮懈。一旦機(jī)器恢復(fù),有用戶嘗試成功优训,馬上就可以激活機(jī)器。所以機(jī)器故障各聘,不需要人工禁用和啟用機(jī)器揣非,全自動處理。

接下來分享一下帶寬預(yù)測躲因。如果用UDP線性增加發(fā)送速率早敬,接收速率曲線會是什么樣子的忌傻?

這是我們實測的效果。為什么會這樣呢搞监?主要是路由器要維持公平性水孩。TCP傳輸是很友好的,當(dāng)遇到網(wǎng)絡(luò)擁塞的時候琐驴,會自動縮小發(fā)送窗口俘种,減少發(fā)送量。但UDP是自己實現(xiàn)的绝淡,如果UDP不做這么友好宙刘,豈不是我發(fā)越多,搶占帶寬就越多牢酵?這樣TCP還能傳輸嗎悬包?所以路由器做了一個策略,如果我告訴你網(wǎng)絡(luò)擁塞馍乙,你不減少發(fā)送量布近,我就懲罰你。于是就出現(xiàn)了這樣的接收曲線丝格。所以撑瞧,我們不能盡最大能力的發(fā)送數(shù)據(jù),必須要預(yù)測帶寬铁追,保證不要超過帶寬(不要長時間超帶寬)季蚂。我們先看看TCP是怎么做的。

這是TCP的經(jīng)典擁塞控制算法琅束,現(xiàn)有用得最廣泛的算法扭屁。可以看到涩禀,帶寬估計在窗口大小24左右料滥。接近帶寬的地方,有很多三角形區(qū)域艾船,是用不上的葵腹。

QQ音視頻帶寬預(yù)測,一開始做秒高清屿岂,在1秒內(nèi)粗獷的預(yù)測一下帶寬情況践宴,然后從預(yù)測的帶寬開始,逐漸增加爷怀,達(dá)到帶寬瓶頸后阻肩,回調(diào)一個周期,然后持續(xù)傳輸一段時間运授。如果持續(xù)的過程中烤惊,路由器繼續(xù)提示擁塞乔煞,會繼續(xù)向下回調(diào)。如果傳輸沒有異常柒室,會隔段時間向上探測帶寬是否增加渡贾。

這個預(yù)測算法究竟怎么樣呢?我們來和競品對比一下吧:

(圖注:請忽略QQ測試結(jié)束點的數(shù)據(jù)雄右,是因為測試結(jié)束點空骚,采集數(shù)據(jù)時長未達(dá)到統(tǒng)計周期導(dǎo)致)

從圖中可以看出,在網(wǎng)絡(luò)限制總帶寬以及設(shè)置固定丟包率的情況下不脯,QQ的帶寬波動都很小府怯,而競品要么波動大,要么不斷往下調(diào)傳輸量防楷。

丟包的原因都有哪些牺丙?

我們列舉丟包原因,不僅僅是列出來复局,還要分析其中的規(guī)律冲簿。

我們發(fā)現(xiàn),左邊的這類丟包亿昏,丟的比例跟我們數(shù)據(jù)發(fā)多發(fā)少峦剔,關(guān)系不大,而右邊這類角钩,發(fā)得越多吝沫,丟的比例越大。我們稱左邊的這類叫固有丟包递礼,右邊這類叫擁塞丟包惨险。分類也不是目的,而是思考怎么更好的抗丟包脊髓。

通潮栌洌抗丟包有兩種方式,F(xiàn)EC和ARQ将硝。FEC是前向冗余恭朗,舉個例子,發(fā)送數(shù)據(jù)A和B依疼,增加發(fā)送一個數(shù)據(jù)C等于A和B的異或痰腮。接收方接到這3個包的任意2個包,異或一下就可以得到第3個包律罢。當(dāng)然诽嘉,實際的FEC沒這么簡單,通常會有比較復(fù)雜的矩陣運算。ARQ就是接收方發(fā)現(xiàn)丟包后虫腋,去發(fā)送方請求重傳。

FEC傳遞簡單稀余,只需要單向傳輸就可以支持悦冀,延時小,缺點就是丟包率波動大時睛琳,抗丟包能力差盒蟆。ARQ的優(yōu)點是網(wǎng)絡(luò)攜帶率高,但延遲大师骗,當(dāng)延時大或擁塞丟包的情況历等,不能使用ARQ。擁塞丟包時辟癌,使用ARQ會加大傳輸量寒屯,導(dǎo)致?lián)砣鼑?yán)重。

音視頻質(zhì)量評估黍少,是比較麻煩的事情寡夹。很多東西都是比較主觀的,人的關(guān)注點有差異厂置,對視頻好壞的判斷也就有了差異菩掏。業(yè)界常見的評分體系有很多,都比較客觀昵济。騰訊也有自己的無參考評分智绸,會偏主觀一些,是通過對兩千多人對不同質(zhì)量視頻主觀評價访忿,擬合而形成的瞧栗。得到通過各種參數(shù)評估音視頻主觀質(zhì)量的公式,擬合的公式有點龐大醉顽,但外界不一定認(rèn)可沼溜,所以對外,我們還是主要用業(yè)界常用的評分體系評估游添,對內(nèi)才使用無參考評分系草。

舉個例子,我們用POLQA評分來衡量我們的音質(zhì):

可以看到唆涝,騰訊的音視頻找都,在丟包率30%的情況評分還比較好。從主觀體驗來說廊酣,騰訊的在丟包30%的環(huán)境能耻,還能聽得清楚說話,而競品基本聽不清楚了。

這些數(shù)據(jù)是怎么來的晓猛?

這就是騰訊的音視頻實驗室饿幅,有專門的隔音音頻實驗室、網(wǎng)絡(luò)損傷儀等等戒职。

下一篇為大家?guī)怼径嗳艘粢曨l及直播互動】的詳細(xì)學(xué)習(xí)資料栗恩,敬請期待。

更多資料可關(guān)注官方公眾號:編風(fēng)網(wǎng)(微信ID:befoio)或 WebRTC編風(fēng)網(wǎng)(微信ID:webrtcorgcn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洪燥,一起剝皮案震驚了整個濱河市磕秤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捧韵,老刑警劉巖市咆,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異再来,居然都是意外死亡蒙兰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門其弊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來癞己,“玉大人,你說我怎么就攤上這事梭伐”匝牛” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵糊识,是天一觀的道長绩社。 經(jīng)常有香客問我,道長赂苗,這世上最難降的妖魔是什么愉耙? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拌滋,結(jié)果婚禮上朴沿,老公的妹妹穿的比我還像新娘。我一直安慰自己败砂,他們只是感情好赌渣,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昌犹,像睡著了一般坚芜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斜姥,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天鸿竖,我揣著相機(jī)與錄音沧竟,去河邊找鬼。 笑死缚忧,一個胖子當(dāng)著我的面吹牛悟泵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搔谴,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼魁袜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敦第?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤店量,失蹤者是張志新(化名)和其女友劉穎芜果,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體融师,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诸蚕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冲泥。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怀伦,靈堂內(nèi)的尸體忽然破棺而出脆烟,到底是詐尸還是另有隱情,我是刑警寧澤房待,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布邢羔,位于F島的核電站,受9級特大地震影響桑孩,放射性物質(zhì)發(fā)生泄漏拜鹤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一流椒、第九天 我趴在偏房一處隱蔽的房頂上張望敏簿。 院中可真熱鬧,春花似錦宣虾、人聲如沸惯裕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轻猖。三九已至,卻和暖如春域那,著一層夾襖步出監(jiān)牢的瞬間咙边,已是汗流浹背猜煮。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留败许,地道東北人王带。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像市殷,于是被迫代替她去往敵國和親愕撰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容