RTC 系统音频弱网对抗技术发展与实践
yuyutoo 2024-10-12 01:19 8 浏览 0 评论
本文整理自线上直播【MCtalk Live#2 :RTC 系统音频弱网对抗技术发展与实践】网易云信资深音视频引擎开发专家崔承宗分享内容。
1、背景介绍
RTC(Real Time Communication)系统广泛应用在视频会议、在线医疗、泛娱乐、在线教育等实时互动场景,为用户提供低延时、高清晰度和流畅度、高保真音质的实时互动体验。音频弱网对抗技术旨在提升 RTC 系统在弱网(高丢包、大抖动、高延迟)条件下的用户体验。
本文从 RTC 系统的音频弱网效果、弱网对抗的诸多技术以及 RTC 系统层面进行较为详尽的分析,希望可以帮助读者对 RTC 系统的音频弱网对抗技术有所了解。
2、常见音频弱网卡顿现象
实际场景中常见的音频弱网卡顿现象有如下表所示几次情况:
表1 常见 RTC 应用音频弱网卡顿现象 | |||
序号 | 现象 | 排查路径 | 问题归类 |
1 | 音乐声音不饱满、发闷,飘忽、卡顿 | 确认 CODEC 采样率、码率,编码器类型 | CODEC类 型选型,CODEC参数设置 |
2 | 声音快进、慢放 | 网络 RTT,网络数据突发数据量,设备信号强度等 | 网络抖动、去抖动处理逻辑、网络连接信号差等 |
3 | 声音卡顿、卡死、断续 | 网络丢包率和 RTT、网络带宽预测、码率分配、网络拥塞控制等 | 网络拥塞、网络连接差等 |
3、RTC 系统音频的抗性
针对上述音频卡顿现象,我们该如何应对呢?表2列举了业界常用的音频抗丢包算法和相互对比。
表2 业界常用的音频抗丢包算法对比 | |||||
对比 | 带外 FEC | Opus/SILK 带内 FEC | RED | ARQ | PLC |
延迟 | 分组延时+单向传输的时间 | 1或者2倍帧长+单向传输的时间 | RED 最大层数 N 倍的帧长+单向传输的时间 | N 倍 RTT 的传输延时,N 是最大重传次数 | 无延迟 |
使用方式 | 前向纠错 | 编码器特性 | 前向纠错 | 后验纠错 | 后验纠错 |
适用情况 | 随机丢包、网络 RTT 较大、包长度较大的场景 | 小丢包或者非连续丢包、编码器编码码率较高的场景 | 随机丢包、网络 RTT 较大、包长度较小的场景 | 突发丢包和持续丢包、网络 RTT 较小的场景 | 小丢包或者非连续丢包根据上下文或者临近波形生成相似波形 |
实现难度 | 相对复杂,涉及到发端、收端FEC编解码逻辑,动态冗余、反馈及时性等 | 相对简单,涉及编码器码率和网络丢包模型 | 复杂度低于带外 FEC,涉及到动态冗余、反馈及时性等 | 看似简单,实际上网络复杂场景下的挑战较大 | 相对复杂,通过波形相关性或者噪声填充,提升抗丢包能力 |
下面,我们详细介绍一下音频抗性的这几种算法。
抗丢包 FEC
前向纠错也叫前向纠错码(Forward Error Correction,简称 FEC),是增加数据通信可信度的方法。FEC 利用数据进行冗余信息的传输,当传输中出现数据丢失时,将允许接收端根据已经接收的数据恢复丢失数据。
如下图所示,我们可以看到,发送端将数据包根据冗余度参数进行分组 (block),对分组数据增加冗余。接收端在收齐分组后,即可恢复丢失数据(条件是丢失不超过冗余包数)。因为接收端要等待FEC分组到齐,所以存在 FEC 恢复算法上的延时, FecDelay = Block个数 * 帧长。
那么,常用的 FEC 冗余算法包括哪些呢?
RTC 系统中常用的 FEC 冗余算法包括:XOR、Reed Solomon、喷泉码等。其中,以 XOR 和 Reed Solomon 算法的应用较为广泛。
下面简单介绍一下 Reed Solomon 算法的数学背景。
Reed Solomon 算法的核心思想包括三个部分:
- 利用范德蒙德(Vandermonde)矩阵 F,通过数据块计算编码块(即算冗余矩阵),如图2所示
- 利用高斯消元法(Gaussian elimination) ,恢复损坏的数据块 (即算冗余矩阵的逆矩阵)
- 为了方便计算机处理,所有的运算是在伽罗华域 Galios, GF(2^w) 的基础上进行
抗丢包 RED
如前所述,RS FEC 算法由于涉及矩阵运算,在发送端和接收端都会增加额外的性能开销。考虑到音频包长度较小,采用 RED(Redundant Audio Data)方式进行冗余是一种更有优势的策略,可以提高数据包 payload 的利用率,并降低性能开销。
我们举一个实际的例子:一个 RTP 音频数据包,包括一个 DVI4(8KHz) 主编码块和一个单独的 8KHz LPC 编码的冗余块,两者长度均为 20ms。参照 RFC 2198 标准所定义,示例格式如图3所示。
抗丢包 ARQ
介绍了 FEC 和 RED 这两种前向纠错方法之后,下面我们再看一下音频 ARQ。
音频 ARQ(自动重传请求)重传使用的是 NACK 方式,如下图。
假设是随机均匀丢包场景,重传失败率概率为:Pn = P(n-1)*lossrate。对于音频来说,假设当重传失败概率 Pn<1% 时,认为重传成功,那么 n 就是重传成功所需的次数(截断二进制指数退避算法)。
各种丢包率条件下需要的理论重传次数如表3所示。
表3 各种丢包率条件下需要的理论重传次数 | |
丢包率 | 需要重传的理论次数 |
10% | 1 |
20% | 2 |
30% | 3 |
40% | 5 |
50% | 6 |
60% | 8 |
70% | 10 |
80% | 21 |
我们可以看一下两种情况:
- 假设 10% 丢包:重传一次失败的概率 10% * 10% = 1%。
- 假设 50% 丢包:重传一次失败 50%50%=25%,2次:2550% = 12.5%,4次: 3.125%,6次:0.78%。
音频快速重传 ARQ 就是以“选择重传”算法作为基本的请求策略,其算法的关键特色在于重传请求与 JitterBuffer 的紧密配合。
- 请求重传模块记录并缓存所有重传数据包的重传成功所消耗的时间,并将重传延时 Arq Delay 告知 JitterBuffer 模块,提高了数据的缓冲等待时长的高可控性,参见(6)。
- 接收端通过 ARQ 请求,在数据缓冲队列的数据帧被播放之前,当还未重传成功的数据帧在已经达到播放时间时,接收端通过 ACK 通知取消请求重传,减少无用请求,参见(5)。
ARQ 策略受 RTT 影响较大,由于 ARQ 的原理是针对丢包进行选择性请求和重传,所以它对于突发丢包有较好的对抗能力,冗余码率的利用率远高于 FEC 和 RED。
ARQ 策略在使用中的难点是合理把握 NACK 请求的时机和间隔以及重传包的码率控制,防止误请求、多请求和多重传,尤其在抖动场景下需要格外关注。
抗抖动
弱网环境除了丢包以外,在 4G 和 Wifi 等移动接入场景中抖动和乱序较为常见,主要原因是移动链路的多径干扰、信号衰减、临频干扰等。为了处理抖动和乱序,保证接收端数据包的有序接收,在 RTC 系统的接收端引入抗抖动模块,原理如图6所示。
抗抖动模块重要的组成部分之一是网络抖动的预测。抗抖动模块根据网络抖动的预测结果自适应调节Jitterbuffer长度,以达到抗抖动的目的,并能够在网络无抖动的时候保证低延时。抗抖动模块的抖动预测模块原理如图7和8所示。
Jitterbuffer 模块的网络延时估计是以 IAT(inter arrival time)为基础的。IAT 的含义是相邻包到达时间间隔。通话时间越长,包间隔 IAT 的概率分布越稳定。观察周期内 IAT 的整体概率分布之和近似为1。一般采用 95% 作为满足统计概率的阈值,计算出 Jitterbuffer 的目标值大小。
抖动预测之后,需要对 buffer 中音频数据进行调节,常用的做法是进行加减速播放。在需要拉伸 jitterbuffer 的时候进行慢放操作,在需要压缩 jitterbuffer 的时候进行快放操作。
- 语音时长修正(Time Scale Modification, TSM)是一种通过扩展或者压缩语音长度,从而改变语音速度的技术。在进行时域压缩或者扩展的同时,还应尽量保证语音信号的基音频率及音色—即变长不变调。
- Wsola(波形形似同步叠加法)是一种基于语音信号准周期特性,进而插入基因周期整数倍的信号来实现波形长度变化的算法。
4、RTC 系统音频的编解码
在介绍了 RED、ARQ 和抗抖动等弱网对抗技术之后,我们再介绍一下基于音频编解码器实现的弱网对抗技术。
如下图,说明了各种编解码器的质量与码率的关系:
图中绿色线条代表的是无专利要求且开源的编解码器,其中 G.711 和 G.722 是 ITU 早期应用于电信网络的语音编码标准,相应只支持窄带和宽带频率范围,码率相对固定,压缩率较低。蓝色线条代表的是无专利要求但是闭源的编解码器,相比 G.711 和 G.722,它们支持的频带更广。最后,红色线条代表的是有专利要求并且闭源的编解码器,其中 AAC 和 MP3 是 Fraunhofer 主导制定的音乐编解码器标准,广泛应用在数字音乐领域。
图10 则说明了各种编码器的编码延迟与码率的关系:
从图中也可以看出,除了 Opus 以外,其他编解码器的码率变化范围相对较小,这与编解码器所覆盖的频带范围相关。另外,不同编解码器的编码延时也有明显差异,MP3 和 AAC 等音乐编解码器的编码延时较大。
由此,我们可以得出结论,Opus(RFC 6716) 是唯一一个覆盖全频带的音频编码器,并且它有如下的特性:
- 支持动态码率
- 在同等码率水平(高于8kbps),其质量高于其他音频编码器
- 其编码延迟低于其他音频编码器
带内 FEC
Opus 编解码器内部支持的原生带内 FEC 在 Speech 场景下,可以处理大约 20% 以内的丢包,其原理是通过当前帧携带前一帧的缩小版压缩包信息来恢复丢失的信源。如图11所示。
具体到 Opus 编码器内部实现,inband FEC 是通过 LBRR(Low Bitrate Redundant)帧实现的。LBRR 帧包含了前一个音频帧的信息,和当前帧一起打包编码。图12是 LBRR 帧的编码代码。
PLC
以上介绍了多种带外抗丢包策略,下面简单介绍一下丢包补偿策略 PLC。
PLC(Packet Loss Concealment)丢包补偿是 Opus 编解码器中的一个可选项,在弱网传输场景下应该开启这个特征。
PLC 代码的实现根据收到的数据包模式的不同而有所不同:在 CELT 模式(audio)和 SILK 模式(speech),PLC 分别采用不同的方式进行丢包补偿。
5、总结
最后,我们总结一下音频RTC系统整体的结构,从系统角度分析一下,如图14所示。
今天分享了音频 RTC 系统的弱网对抗技术与实践,总结值得我们思考的几个方面:
- 表面上的音频卡顿,背后往往隐藏着各种各样的问题,需要对各个问题逐一进行分析;
- RTC 系统的任意一个环节出问题,最终呈现给用户的就是不足的音频体验;
- RTC 系统中各个模块组成一个有机整体,如何有效适应复杂多变的网络环境,将各个模块弱网对抗的能力有机结合,从而发挥最大的作用,是一个颇具挑战的课题,值得我们不断探索。
以上,就是本次分享的全部内容。
作者介绍
崔承宗,网易云信音视频引擎专家,10余年音视频引擎开发经验,对 WebRTC 引擎、音视频会议系统、视频编解码技术有一定研究和实践经验。
相关推荐
- 墨尔本一华裔男子与亚裔男子分别失踪数日 警方寻人
-
中新网5月15日电据澳洲新快网报道,据澳大利亚维州警察局网站消息,22岁的华裔男子邓跃(Yue‘Peter’Deng,音译)失踪已6天,维州警方于当地时间13日发布寻人通告,寻求公众协助寻找邓跃。华...
- 网络交友须谨慎!美国犹他州一男子因涉嫌杀害女网友被捕
-
伊森·洪克斯克(图源网络,侵删)据美国广播公司(ABC)25日报道,美国犹他州一名男子于24日因涉嫌谋杀被捕。警方表示,这名男子主动告知警局,称其杀害了一名在网络交友软件上认识的25岁女子。雷顿警...
- 一课译词:来龙去脉(来龙去脉 的意思解释)
-
Mountainranges[Photo/SIPA]“来龙去脉”,汉语成语,本指山脉的走势和去向,现比喻一件事的前因后果(causeandeffectofanevent),可以翻译为“i...
- 高考重要考点:range(range高考用法)
-
range可以用作动词,也可以用作名词,含义特别多,在阅读理解中出现的频率很高,还经常作为完形填空的选项,而且在作文中使用是非常好的高级词汇。...
- C++20 Ranges:现代范围操作(现代c++白皮书)
-
1.引言:C++20Ranges库简介C++20引入的Ranges库是C++标准库的重要更新,旨在提供更现代化、表达力更强的方式来处理数据序列(范围,range)。Ranges库基于...
- 学习VBA,报表做到飞 第二章 数组 2.4 Filter函数
-
第二章数组2.4Filter函数Filter函数功能与autofilter函数类似,它对一个一维数组进行筛选,返回一个从0开始的数组。...
- VBA学习笔记:数组:数组相关函数—Split,Join
-
Split拆分字符串函数,语法Split(expression,字符,Limit,compare),第1参数为必写,后面3个参数都是可选项。Expression为需要拆分的数据,“字符”就是以哪个字...
- VBA如何自定义序列,学会这些方法,让你工作更轻松
-
No.1在Excel中,自定义序列是一种快速填表机制,如何有效地利用这个方法,可以大大增加工作效率。通常在操作工作表的时候,可能会输入一些很有序的序列,如果一一录入就显得十分笨拙。Excel给出了一种...
- Excel VBA入门教程1.3 数组基础(vba数组详解)
-
1.3数组使用数组和对象时,也要声明,这里说下数组的声明:'确定范围的数组,可以存储b-a+1个数,a、b为整数Dim数组名称(aTob)As数据类型Dimarr...
- 远程网络调试工具百宝箱-MobaXterm
-
MobaXterm是一个功能强大的远程网络工具百宝箱,它将所有重要的远程网络工具(SSH、Telnet、X11、RDP、VNC、FTP、MOSH、Serial等)和Unix命令(bash、ls、cat...
- AREX:携程新一代自动化回归测试工具的设计与实现
-
一、背景随着携程机票BU业务规模的不断提高,业务系统日趋复杂,各种问题和挑战也随之而来。对于研发测试团队,面临着各种效能困境,包括业务复杂度高、数据构造工作量大、回归测试全量回归、沟通成本高、测试用例...
- Windows、Android、IOS、Web自动化工具选择策略
-
Windows平台中应用UI自动化测试解决方案AutoIT是开源工具,该工具识别windows的标准控件效果不错,但是当它遇到应用中非标准控件定义的UI元素时往往就无能为力了,这个时候选择silkte...
- python自动化工具:pywinauto(python快速上手 自动化)
-
简介Pywinauto是完全由Python构建的一个模块,可以用于自动化Windows上的GUI应用程序。同时,它支持鼠标、键盘操作,在元素控件树较复杂的界面,可以辅助我们完成自动化操作。我在...
- 时下最火的 Airtest 如何测试手机 APP?
-
引言Airtest是网易出品的一款基于图像识别的自动化测试工具,主要应用在手机APP和游戏的测试。一旦使用了这个工具进行APP的自动化,你就会发现自动化测试原来是如此简单!!连接手机要进行...
- 【推荐】7个最强Appium替代工具,移动App自动化测试必备!
-
在移动应用开发日益火爆的今天,自动化测试成为了确保应用质量和用户体验的关键环节。Appium作为一款广泛应用的移动应用自动化测试工具,为测试人员所熟知。然而,在不同的测试场景和需求下,还有许多其他优...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)