兼容 WebRTC 的开源抗丢包音频编解码器SOLO

在 RTC 2019 第五届实时互联网大会的编解码技术专场上,声网开源了自研抗丢包音频编解码器Agora SOLO。

目前,编解码器的源代码已经开源在 Github 上:https://github.com/AgoraIO-Community/Solo

这个开源项目兼容 WebRTC,可集成于多种场景下的实时音视频应用中,比如在线课堂、直播社交、游戏语音开黑、IoT 等。在分析它的特性之前,首先要讲一下它名字中的一个关键词,丢包。

丢包是什么?

尽管很多人开始使用 WebRTC 了,但是其中有不少人都对「丢包」的概念不是很熟悉。所以,首先我们要解释一下。由于 SOLO 是音频编解码器,我们接下来讲的场景,主要是指其中的实时音频部分。

我们现在的互联网生活中有各种各样的实时音视频互动场景,比如:

- 泛娱乐社交:直播连麦、跨直播间 PK、游戏语音开黑等

- 在线教育:一对一教学、双师课堂、大班课、在线音乐教室等

- 其它创新场景,包括 VR、机器人等

这些场景都需要通过网络进行实时传输。如果我们将互联网看作为高速公路,那么音频数据是一辆辆车。丢包就是有的车无法在有效时间内无法达到终点,甚至可能永远也到不了终点。假如我们的一百辆车里有五辆车没能到达终点,我们这次车队传输的“丢包率”就是5%。是的,互联网传输也一样,它并不是百分百可靠的,总有数据无法按时传输到目的地。

如果丢包率大,会造成什么后果呢?

如果丢包比较严重,微信电话、视频聊天或语音连麦的时候,你听到的对方的声音可能音质很差,甚至是断断续续的,或者干脆没有声音。而这种情况在任何网络下都可能出现。不论你是通过 Wi-Fi、4G 还是 5G,都可能因为进入地下车库、进入电梯、信号覆盖不良、网络带宽受限等原因,遇到这些实时音频体验问题。所以,这就需要抗丢包策略,来保障音频体验。

我们曾在一篇内容中详细讲过传统的抗丢包策略,在这里我们不赘述。然而,传统的抗丢包策略不是会浪费带宽,就是会影响音频质量,所以我们结合信源和信道编码的特点,利用充分包交换网络的特性,基于此,研发出了抗丢包音频编解码器——Agora SOLO(以下简称“SOLO”)。

SOLO 是什么?

SOLO 是由声网Agora自主研发的一款面向不稳定网络的音频编解码器。

更重要的是,SOLO 编解码器兼容WebRTC。如果开发者正在基于 WebRTC 开发自己的应用,可将 SOLO 集成到其中。

要知道,WebRTC 默认使用的是 Opus 作为编解码器,而 Silk 与 Opus 有千丝万缕的联系,我们曾经在RTC 专栏的一篇投稿中讲过。而 SOLO 则是以 Silk 为基础,融合了带宽扩展(BWE)和多描述编码(MDC)等技术,使其能在较低复杂度下拥有弱网对抗能力。也就是说,在 SOLO 的帮助下, WebRTC 应用可以更好地应对不稳定的网络环境,对音频质量与体验带来有效的保障与提升。

根据我们此前的测试(如下图),一个中文的女声序列在不同编解码器下的 MOS 分比较。第一列是不同的丢包率,后面各列是不同编解码器在不同丢包率下的分数。可以看到在丢包率25%时,SOLO 的 MOS 分比其它编解码器有所提高。当然,我们还在此前的内容中公开过更多跑分的细节。

利用 SOLO,可以不再关心网络丢包状态,因为它会默认发两个包。如果只收到一个就是有限失真,收到两个就是高质量的恢复。

下面,我们看一下 SOLO 编解码器的架构。

图 1. SOLO 编码器架构


图 2. SOLO 解码器架构


SOLO的抗丢包策略与传统方法不同。从通信原理来说,信源编码是尽可能去追求高压缩比,去冗余。而信道编码是追求强纠错,靠加冗余来实现纠错。SOLO 就是把加冗余和减冗余结合起来,不重要的地方减冗余,重要的地方加冗余。在传输过程中,它会将一个包拆分为两个进行传输,如果对端收到其中一个,则解码恢复出一个有限失真的信号;如果对端收到两个包,则可解码恢复出一个高质量的信号。即 SOLO 不需要等待对当前网络丢包状态的统计,只需要直接把抗丢包做到编解码内部。好处有三点:1.可实现更低延时;2.可实现更高质量,当收到一个包时质量达到的普通编解码器水平,收到两个包达到高质量编解码水平;3. 可面向多人环境。

SOLO 关键技术

一、带宽扩展

SOLO 使用带宽扩展的主要原因是希望减少计算复杂度,在 Silk WB 模式中,16khz 的信号都会进入后续处理模块,而对于语音来说,8khz 以上的信息是非常少的,这部分信息进入到后续处理模块,会带来一定的计算资源浪费。MDC 因为要引入额外分析模块处理多条码流,又会引入额外的复杂度,这是 MDC 在近些年来落地不顺畅的重要原因之一。为了减少复杂度,我们在编码宽带信号前,将其分为 0-8k 的窄带信息和 8-16k 的高频信息。只有窄带信息会进入到后续正常分析、编码流程中,这样后续的计算量就减少了一半,同时得益于带宽扩展算法,整体质量不会有明显下降。高频信息部分,SOLO 使用独立的分析与编码模块,默认将高频信息压缩成 1.6kbps 的码流。这部分高频信息可以在解码器内结合低频信号恢复出高频信号。

二、结合 delay-decision 的 MDC

在 Silk 中,delay-decision 模块是一个滞后计算编码误差的模块,它可以从多个候选码流中选择误差最小的码流作为编码输出,一定程度上来说,它使得标量量化拥有了矢量量化的性能。SOLO 利用 delay-decision 模块,实现了多描述码流的分析与构建。SOLO 的MDC主要作用于滤波器输出的残差信号, SOLO 会根据当前信号状态,对残差信号做多增益控制:计算出 MD 增益 a(0<a<1),将 a 作用于奇数子帧,并将(1-a)作用于偶数子帧以产生两段互补的残差信号,这里记作 residual 1 和 residual 2。

图 3. 多描述残差信号产生


随后,这两段残差信号会进入到新的 delay-decision 模块中,每个残差信号使用不同的抖动和量化方法,一共可以产生 8 种不同的备选状态,两两组合起来共有 64 种备选合成状态,新的 delay-decision 模块会对每个残差信号的独立误差和两个残差信号的合成误差进行加权求和,决定出最佳的两个残差信号进入到编码模块。

三、输出码流组包

图 4. 编码器码流整合及组包


SOLO 默认配置为每次输入 40ms(2 帧),输出两段互补的多描述码流,解码器接收到任一段码流,即可解码出 40ms 的信号。为了方便接收端区分码流的顺序,码流第一个字节的右数第 4 个 bit 是码流顺序标志位,第一段码流标志位的值是 0,第二段码流标志位的值是 1。接收端在进行码流处理时,可依据此标志位进行码流顺序判断。

SOLO 已在 Github 开源,请点击这里跳转 Github。当然,如果你对于SOLO 有任何疑问,欢迎在 RTC 开发者社区中讨论

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270