兼容 WebRTC 的開源抗丟包音頻編解碼器SOLO

在?RTC 2019 第五屆實(shí)時(shí)互聯(lián)網(wǎng)大會(huì)的編解碼技術(shù)專場上,聲網(wǎng)開源了自研抗丟包音頻編解碼器Agora SOLO。

目前,編解碼器的源代碼已經(jīng)開源在 Github 上:https://github.com/AgoraIO-Community/Solo

這個(gè)開源項(xiàng)目兼容 WebRTC,可集成于多種場景下的實(shí)時(shí)音視頻應(yīng)用中,比如在線課堂、直播社交、游戲語音開黑、IoT 等。在分析它的特性之前,首先要講一下它名字中的一個(gè)關(guān)鍵詞,丟包。

丟包是什么?

盡管很多人開始使用 WebRTC 了,但是其中有不少人都對(duì)「丟包」的概念不是很熟悉。所以,首先我們要解釋一下。由于 SOLO 是音頻編解碼器,我們接下來講的場景,主要是指其中的實(shí)時(shí)音頻部分。

我們現(xiàn)在的互聯(lián)網(wǎng)生活中有各種各樣的實(shí)時(shí)音視頻互動(dòng)場景,比如:

- 泛娛樂社交:直播連麥、跨直播間 PK、游戲語音開黑等

- 在線教育:一對(duì)一教學(xué)、雙師課堂、大班課、在線音樂教室等

- 其它創(chuàng)新場景,包括 VR、機(jī)器人等

這些場景都需要通過網(wǎng)絡(luò)進(jìn)行實(shí)時(shí)傳輸。如果我們將互聯(lián)網(wǎng)看作為高速公路,那么音頻數(shù)據(jù)是一輛輛車。丟包就是有的車無法在有效時(shí)間內(nèi)無法達(dá)到終點(diǎn),甚至可能永遠(yuǎn)也到不了終點(diǎn)。假如我們的一百輛車?yán)镉形遢v車沒能到達(dá)終點(diǎn),我們這次車隊(duì)傳輸?shù)摹皝G包率”就是5%。是的,互聯(lián)網(wǎng)傳輸也一樣,它并不是百分百可靠的,總有數(shù)據(jù)無法按時(shí)傳輸?shù)侥康牡亍?/p>

如果丟包率大,會(huì)造成什么后果呢?

如果丟包比較嚴(yán)重,微信電話、視頻聊天或語音連麥的時(shí)候,你聽到的對(duì)方的聲音可能音質(zhì)很差,甚至是斷斷續(xù)續(xù)的,或者干脆沒有聲音。而這種情況在任何網(wǎng)絡(luò)下都可能出現(xiàn)。不論你是通過 Wi-Fi、4G 還是 5G,都可能因?yàn)檫M(jìn)入地下車庫、進(jìn)入電梯、信號(hào)覆蓋不良、網(wǎng)絡(luò)帶寬受限等原因,遇到這些實(shí)時(shí)音頻體驗(yàn)問題。所以,這就需要抗丟包策略,來保障音頻體驗(yàn)。

我們曾在一篇內(nèi)容中詳細(xì)講過傳統(tǒng)的抗丟包策略,在這里我們不贅述。然而,傳統(tǒng)的抗丟包策略不是會(huì)浪費(fèi)帶寬,就是會(huì)影響音頻質(zhì)量,所以我們結(jié)合信源和信道編碼的特點(diǎn),利用充分包交換網(wǎng)絡(luò)的特性,基于此,研發(fā)出了抗丟包音頻編解碼器——Agora SOLO(以下簡稱“SOLO”)。

SOLO 是什么?

SOLO 是由聲網(wǎng)Agora自主研發(fā)的一款面向不穩(wěn)定網(wǎng)絡(luò)的音頻編解碼器。

更重要的是,SOLO 編解碼器兼容WebRTC。如果開發(fā)者正在基于 WebRTC 開發(fā)自己的應(yīng)用,可將 SOLO 集成到其中。

要知道,WebRTC 默認(rèn)使用的是 Opus 作為編解碼器,而 Silk 與 Opus 有千絲萬縷的聯(lián)系,我們曾經(jīng)在RTC 專欄的一篇投稿中講過。而 SOLO 則是以 Silk 為基礎(chǔ),融合了帶寬擴(kuò)展(BWE)和多描述編碼(MDC)等技術(shù),使其能在較低復(fù)雜度下?lián)碛腥蹙W(wǎng)對(duì)抗能力。也就是說,在 SOLO 的幫助下, WebRTC 應(yīng)用可以更好地應(yīng)對(duì)不穩(wěn)定的網(wǎng)絡(luò)環(huán)境,對(duì)音頻質(zhì)量與體驗(yàn)帶來有效的保障與提升。

根據(jù)我們此前的測試(如下圖),一個(gè)中文的女聲序列在不同編解碼器下的 MOS 分比較。第一列是不同的丟包率,后面各列是不同編解碼器在不同丟包率下的分?jǐn)?shù)。可以看到在丟包率25%時(shí),SOLO 的 MOS 分比其它編解碼器有所提高。當(dāng)然,我們還在此前的內(nèi)容中公開過更多跑分的細(xì)節(jié)。

利用 SOLO,可以不再關(guān)心網(wǎng)絡(luò)丟包狀態(tài),因?yàn)樗鼤?huì)默認(rèn)發(fā)兩個(gè)包。如果只收到一個(gè)就是有限失真,收到兩個(gè)就是高質(zhì)量的恢復(fù)。

下面,我們看一下 SOLO 編解碼器的架構(gòu)。

圖 1. SOLO 編碼器架構(gòu)


圖 2. SOLO 解碼器架構(gòu)


SOLO的抗丟包策略與傳統(tǒng)方法不同。從通信原理來說,信源編碼是盡可能去追求高壓縮比,去冗余。而信道編碼是追求強(qiáng)糾錯(cuò),靠加冗余來實(shí)現(xiàn)糾錯(cuò)。SOLO 就是把加冗余和減冗余結(jié)合起來,不重要的地方減冗余,重要的地方加冗余。在傳輸過程中,它會(huì)將一個(gè)包拆分為兩個(gè)進(jìn)行傳輸,如果對(duì)端收到其中一個(gè),則解碼恢復(fù)出一個(gè)有限失真的信號(hào);如果對(duì)端收到兩個(gè)包,則可解碼恢復(fù)出一個(gè)高質(zhì)量的信號(hào)。即 SOLO 不需要等待對(duì)當(dāng)前網(wǎng)絡(luò)丟包狀態(tài)的統(tǒng)計(jì),只需要直接把抗丟包做到編解碼內(nèi)部。好處有三點(diǎn):1.可實(shí)現(xiàn)更低延時(shí);2.可實(shí)現(xiàn)更高質(zhì)量,當(dāng)收到一個(gè)包時(shí)質(zhì)量達(dá)到的普通編解碼器水平,收到兩個(gè)包達(dá)到高質(zhì)量編解碼水平;3. 可面向多人環(huán)境。

SOLO 關(guān)鍵技術(shù)

一、帶寬擴(kuò)展

SOLO 使用帶寬擴(kuò)展的主要原因是希望減少計(jì)算復(fù)雜度,在 Silk WB 模式中,16khz 的信號(hào)都會(huì)進(jìn)入后續(xù)處理模塊,而對(duì)于語音來說,8khz 以上的信息是非常少的,這部分信息進(jìn)入到后續(xù)處理模塊,會(huì)帶來一定的計(jì)算資源浪費(fèi)。MDC 因?yàn)橐腩~外分析模塊處理多條碼流,又會(huì)引入額外的復(fù)雜度,這是 MDC 在近些年來落地不順暢的重要原因之一。為了減少復(fù)雜度,我們在編碼寬帶信號(hào)前,將其分為 0-8k 的窄帶信息和 8-16k 的高頻信息。只有窄帶信息會(huì)進(jìn)入到后續(xù)正常分析、編碼流程中,這樣后續(xù)的計(jì)算量就減少了一半,同時(shí)得益于帶寬擴(kuò)展算法,整體質(zhì)量不會(huì)有明顯下降。高頻信息部分,SOLO 使用獨(dú)立的分析與編碼模塊,默認(rèn)將高頻信息壓縮成 1.6kbps 的碼流。這部分高頻信息可以在解碼器內(nèi)結(jié)合低頻信號(hào)恢復(fù)出高頻信號(hào)。

二、結(jié)合 delay-decision 的 MDC

在 Silk 中,delay-decision 模塊是一個(gè)滯后計(jì)算編碼誤差的模塊,它可以從多個(gè)候選碼流中選擇誤差最小的碼流作為編碼輸出,一定程度上來說,它使得標(biāo)量量化擁有了矢量量化的性能。SOLO 利用 delay-decision 模塊,實(shí)現(xiàn)了多描述碼流的分析與構(gòu)建。SOLO 的MDC主要作用于濾波器輸出的殘差信號(hào), SOLO 會(huì)根據(jù)當(dāng)前信號(hào)狀態(tài),對(duì)殘差信號(hào)做多增益控制:計(jì)算出 MD 增益 a(0<a<1),將 a 作用于奇數(shù)子幀,并將(1-a)作用于偶數(shù)子幀以產(chǎn)生兩段互補(bǔ)的殘差信號(hào),這里記作 residual 1 和 residual 2。

圖 3. 多描述殘差信號(hào)產(chǎn)生


隨后,這兩段殘差信號(hào)會(huì)進(jìn)入到新的 delay-decision 模塊中,每個(gè)殘差信號(hào)使用不同的抖動(dòng)和量化方法,一共可以產(chǎn)生 8 種不同的備選狀態(tài),兩兩組合起來共有 64 種備選合成狀態(tài),新的 delay-decision 模塊會(huì)對(duì)每個(gè)殘差信號(hào)的獨(dú)立誤差和兩個(gè)殘差信號(hào)的合成誤差進(jìn)行加權(quán)求和,決定出最佳的兩個(gè)殘差信號(hào)進(jìn)入到編碼模塊。

三、輸出碼流組包

圖 4. 編碼器碼流整合及組包


SOLO 默認(rèn)配置為每次輸入 40ms(2 幀),輸出兩段互補(bǔ)的多描述碼流,解碼器接收到任一段碼流,即可解碼出 40ms 的信號(hào)。為了方便接收端區(qū)分碼流的順序,碼流第一個(gè)字節(jié)的右數(shù)第 4 個(gè) bit 是碼流順序標(biāo)志位,第一段碼流標(biāo)志位的值是 0,第二段碼流標(biāo)志位的值是 1。接收端在進(jìn)行碼流處理時(shí),可依據(jù)此標(biāo)志位進(jìn)行碼流順序判斷。

SOLO 已在 Github 開源,請點(diǎn)擊這里跳轉(zhuǎn) Github。當(dāng)然,如果你對(duì)于SOLO 有任何疑問,歡迎在?RTC 開發(fā)者社區(qū)中討論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評(píng)論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,379評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評(píng)論 2 380