WebRTC 系列之音频的那些事

WebRTC (Web Real-Time Communication)是一个支持网页浏览器进行实时语音对话或视频对话的 API。W3C 和 IETF 在2021年1月26日共同宣布 WebRTC 1.0 定稿,促使 WebRTC 从事实上的互联网通信标准成为了官方标准,其在不同场景的应用将得到更为广泛的普及。WebRTC 提供了视频会议的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:Windows,Mac,iOS,Android。本文主要介绍 WebRTC 的语音引擎,它是 WebRTC 具价值的技术之一。包括音频工作机制、相关的改动以及开发过程中遇到的一些常见问题。

作者:陶金亮 网易云信资深音视频客户端工程师

一、背景

年初因为工作需要,开始学习 WebRTC,就被其复杂的编译环境和巨大的代码量所折服,注定是一块难啃的骨头。俗话说万事开头难,坚持一个恒心,终究能学习到 WebRTC的设计精髓。今天和大家聊聊 WebRTC 中音频的那些事。WebRTC 由语音引擎,视频引擎和网络传输三大模块组成,其中语音引擎是 WebRTC 中具价值的技术之一,实现了音频数据的采集、前处理、编码、发送、接受、解码、混音、后处理、播放等一系列处理流程。

WebRTC 系列之音频的那些事

音频引擎主要包含:音频设备模块 ADM、音频编码器工厂、音频解码器工厂、混音器Mixer、音频前处理 APM。

二、音频工作机制

想要系统的了解音频引擎,首先需要了解核心的实现类和音频数据流向,接下来我们将简单的分析一下。

(一)音频引擎核心类图

WebRTC 系列之音频的那些事
WebRTC 系列之音频的那些事

音频引擎 WebrtcVoiceEngine 主要包含音频设备模块 AudioDeviceModule、音频混音器 AudioMixer、音频 3A 处理器 AudioProcessing、音频管理类 AudioState、音频编码器工厂 AudioEncodeFactory、音频解码器工厂 AudioDecodeFactory、语音媒体通道包含发送和接受等。

  1. 音频设备模块 AudioDeviceModule 主要负责硬件设备层,包括音频数据的采集和播放,以及硬件设备的相关操作。
  2. 音频混音器 AudioMixer 主要负责音频发送数据的混音(设备采集和伴音的混音)、音频播放数据的混音(多路接受音频和伴音的混音)。
  3. 音频 3A 处理器 AudioProcessing 主要负责音频采集数据的前处理,包含回声消除 AEC、自动增益控制 AGC、噪声抑制 NS。APM 分为两个流,一个近端流,一个远端流。近端(Near-end)流是指从麦克风进入的数据;远端(Far-end)流是指接收到的数据。
  4. 音频管理类 AudioState 包含音频设备模块 ADM、音频前处理模块 APM、音频混音器 Mixer 以及数据流转中心 AudioTransportImpl 。
  5. 音频编码器工厂 AudioEncodeFactory 包含了 Opus、ISAC、G711、G722、iLBC、L16 等 codec。
  6. 音频解码器工厂 AudioDecodeFactory 包含了 Opus、ISAC、G711、G722、iLBC、L16 等 codec。

(二)音频的工作流程图

WebRTC 系列之音频的那些事
  1. 发起端通过麦克风进行声音采集
  2. 发起端将采集到的声音信号输送给 APM 模块,进行回声消除 AEC,噪音抑制NS,自动增益控制处理 AGC
  3. 发起端将处理之后的数据输送给编码器进行语音压缩编码
  4. 发起端将编码后的数据通过 RtpRtcp 传输模块发送,通过 Internet 网路传输到接收端
  5. 接收端接受网络传输过来的音频数据,先输送给 NetEQ 模块进行抖动消除,丢包隐藏解码等操作
  6. 接收端将处理过后的音频数据送入声卡设备进行播放

(三) NetEQ 模块是 WebRTC 语音引擎中的核心模块

WebRTC 系列之音频的那些事

在 NetEQ 模块中,又被大致分为 MCU 模块和 DSP 模块。MCU 主要负责做延时及抖动的计算统计,并生成对应的控制命令。而 DSP 模块负责接收并根据 MCU 的控制命令进行对应的数据包处理,并传输给下一个环节.

三、音频数据流向

根据上面介绍的音频工作流程图,我们将继续细化一下音频的数据流向。将会重点介绍一下数据流转中心 AudioTransportImpl 在整个环节中扮演的重要角色。

/private/var/folders/l_/k12mv53d4r7dl0k24g5p33mc0000gn/T/com.kingsoft.wpsoffice.mac/wps-taojinliang/ksohtml/wpsmFYQ5f.jpg

数据流转中心 AudioTransportImpl 实现了采集数据处理接口 RecordDataIsAvailbale和播放数据处理接口 NeedMorePlayData。RecordDataIsAvailbale 负责采集音频数据的处理和将其分发到所有的发送 Streams。NeedMorePlayData 负责混音所有接收到的 Streams,然后输送给 APM 作为一路参考信号处理,最后将其重采样到请求输出的采样率。

RecordDataIsAvailbale 内部主要流程:

  1. 由硬件采集过来的音频数据,直接重采样到发送采样率
  2. 由音频前处理针对重采样之后的音频数据进行 3A 处理
  3. VAD 处理
  4. 数字增益调整采集音量
  5. 音频数据回调外部进行外部前处理
  6. 混音发送端所有需要发送的音频数据,包括采集的数据和伴音的数据
  7. 计算音频数据的能量值
  8. 将其分发到所有的发送 Streams

NeedMorePlayData 内部主要流程:

  1. 混音所有接收到的 Streams 的音频数据
    1. 计算输出采样率 CalculateOutputFrequency()
    2. 从 Source 收集音频数据 GetAudioFromSources() ,选取没有mute,且能量最大的三路进行混音
    3. 执行混音操作 FrameCombiner::Combine()
  2. 特定条件下,进行噪声注入,用于采集侧作为参考信号
  3. 对本地伴音进行混音操作
  4. 数字增益调整播放音量
  5. 音频数据回调外部进行外部前处理
  6. 计算音频数据的能量值
  7. 将音频重采样到请求输出的采样率
  8. 将音频数据输送给 APM 作为一路参考信号处理

由上图的数据流向发现,为什么需要FineAudioBuffer和AudioDeviceBuffer?因为WebRTC 的音频流水线只支持处理 10 ms 的数据,不同的操作系统平台提供了不同的采集和播放时长的音频数据,不同的采样率也会提供不同时长的数据。例如 iOS 上,16K 采样率会提供 8ms 的音频数据 128 帧;8K 采样率会提供 16ms 的音频数据 128帧;48K 采样率会提供 10.67ms的音频数据 512 帧。

AudioDeviceModule 播放和采集的数据,总会通过 AudioDeviceBuffer 拿进来或者送出去 10ms 的音频数据。对于不支持采集和播放 10ms 音频数据的平台,在平台的 AudioDeviceModule 和 AudioDeviceBuffer 还会插入一个 FineAudioBuffer,用于将平台的音频数据格式转换为 10ms 的 WebRTC 能处理的音频帧。在 AudioDeviceBuffer 中,还会 10s 定时统计一下当前硬件设备过来的音频数据对应的采样点个数和采样率,可以用于检测当前硬件的一个工作状态。

四、音频相关改动

  1. 音频 Profile 的实现,支持 Voip 和 Music 2 种场景,实现了采样率、编码码率、编码模式、声道数的综合性技术策略。
  2. iOS 实现了采集和播放线程的分离,支持双声道的播放。
  3. 音频 3A 参数的兼容性下发适配方案。
  4. 耳机场景的适配,蓝牙耳机和普通耳机的适配,动态 3A 切换适配。
  5. Noise_Injection 噪声注入算法,作为一路参考信号,在耳机场景的回声消除中的作用特别明显。
  6. 支持本地伴音文件 file 和网络伴音文件 http & https。
  7. Audio Nack 的实现,提高音频的抗丢包能力,目前正在进行 In-band FEC。
  8. 音频处理在单讲和双讲方面的优化。
  9. iOS 在 Built-In AGC 方面的研究:
  10. Built-In AGC 对于 Speech 和 Music 有效,对于 noise 和环境底噪不会产生作用。
  11. 不同机型的麦克风硬件的增益不同,iPhone 7 Plus > iPhone 8 > iPhone X ;因此会在软件 AGC 和硬件 AGC 都关闭的情况下,远端听到的声音大小表现不一样。
  12. iOS 除了提供的可开关的 AGC 以外,还有一个 AGC 会一直工作,对信号的 level进行微调;猜想这个一直工作的 AGC 是 iOS 自带的 analog AGC,可能和硬件有关,且没有 API 可以开关,而可开关的 AGC 是一个 digital AGC。
  13. 在大部分 iOS 机型上,外放模式“耳机再次插入后”,input 的音量会变小。当前的解决方案是在耳机再次插入后,增加一个 preGain 来把输入的音量拉回正常值。

五、音频问题排查

首先看一下音频最常见的一些现象以及原因:

/private/var/folders/l_/k12mv53d4r7dl0k24g5p33mc0000gn/T/com.kingsoft.wpsoffice.mac/wps-taojinliang/ksohtml/wpsG2d2Ff.jpg

六、总结

本文主要介绍 WebRTC 的语音引擎,包括音频工作机制、相关的改动以及开发过程中遇到的一些常见问题。

作者介绍

陶金亮,网易云信资深音视频客户端开发工程师;2016 年 2 月加入网易,2017 年 8月加入网易云信团队,负责直播、短视频、IM、RTC SDK 的开发工作。

关于网易云信

网易云信:网易智企旗下融合通信云服务专家、通信与视频 PaaS 平台。集网易 24 年 IM 以及音视频技术打造的融合通信云服务专家,稳定易用的通信与视频 PaaS 平台。提供融合通信与视频的核心能力与组件,包含 IM 即时通讯、5G 消息平台、一键登录、信令、短信与号码隐私保护等通信服务,音视频通话、直播、点播、互动直播与互动白板等音视频服务,视频会议等组件服务,并联合网易易盾推出一站式安全通信方案「安全通」。目前,网易云信已经成功发送 1.6 万亿条消息,覆盖智能终端 SDK 数累计超过 186 亿,我们期待每个智能终端都有云信的融合通信能力。

文章标题:WebRTC 系列之音频的那些事,发布者:网易智企,转载请注明出处:https://worktile.com/kb/p/5925

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
网易智企网易智企认证作者
上一篇 2022年3月16日 下午11:43
下一篇 2022年3月17日 上午12:19

相关推荐

  • 跨国研发团队与本地团队的管理差异

    当探讨跨国研发团队与本地团队在管理上的差异时,1、沟通方式、2、团队文化、3、项目协调、4、合规性要求成为关键指标。跨国团队面临着沟通方式的适应性问题,必须克服不同地区和文化带来的挑战。团队文化的差异需要重视多元文化的融合与和谐共存。在项目协调方面,涉及时区差异和任务分配特异性问题。另外,合规性要求…

    2023年11月14日
    1500
  • 跨学科研发团队是如何工作的

    跨学科研发团队依托于不同学科专家的合作,旨在创新解决复杂问题。团队成员通常包括各领域的科学家、工程师、项目管理者和市场专家。1、多元化的专业知识为研发项目提供更全面的视角;2、团队协作的流程管理确保任务高效执行;3、开放的沟通及信息交流鼓励知识共享与观点碰撞;4、灵活的组织结构适应项目需求与成员特点…

    2023年11月30日
    900
  • 编写测试用例有哪几种方法

    编写测试用例的方法有:一、等价类划分法;二、边界值分析法;三、因果图法;四、判定表驱动法;五、场景图法。等价类划分法是把所有可能输入的数据,即将程序的输入域划分为若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。 一、等价类划分法 等价类划分法是把所有可能输入的数据,即将程序…

    2023年3月31日
    18200
  • 如何在多语言网站上进行SEO优化

    在多语言网站进行SEO优化主要依赖于策略规划、技术实施和内容优化这三个核心观点。这里面的策略规划涉及正确使用hreflang标签、创建独立的URL结构以及进行地区化关键字研究。技术实施要点包括采纳适当的域名策略、网站结构优化和页面加载速度的优化。内容优化则需要确保提供高质量的翻译、贴合当地文化的内容…

    2023年11月16日
    2300
  • STM32是什么

    STM32是一款单片机,它由意法半导体公司制造。ST是意法半导体的简称,M是指微控制器(也就是单片机的)MCU的名列前茅个英文字母,32是指32位的CPU,它的CPU是采用的ARM公司的Cortex-M系列的内核设计。 一、STM32是什么 STM32是一款单片机,它由意法半导体公司制造。ST是意法…

    2023年7月28日
    22400
  • 工作任务安排软件有哪些

    工作任务安排软件有这些:1、Worktile;2、PingCode;3、ClickUp;4、Todoist;5、Any.do;6、Things3 Mac;7、HubSpot;8、Trello。Worktile是一个企业协作办公平台,帮助企业实施项目管理、规范流程、搭建知识库以及辅助管理决策。 1、W…

    2023年4月9日
    32300
  • 怎样把GBK编码格式的java转成UTF8

    把GBK编码格式的java转成UTF8的方法:遇到GBK文件直接拿去转成utf-8,传入需要转换的文件地址srcFileName和转出的文件地址destFileName,即可得到utf-8的文件。 延伸阅读 乱码的原因 gbk的中文编码是一个汉字用【2】个字节表示,例如汉字“内部”的gbk编码16进…

    2023年2月7日
    60300
  • 唯品会联席CTO鲁鹏俊:莫急转型管理,尽早贴近业务

    文| babayage 编辑 | 笑 笑 谷歌时期 2006~2014 价值3000万美元的教训 2006年,鲁鹏俊自复旦大学计算机科学硕士毕业,随后加入谷歌。和大多数码农一样, 他虽心存改变世界的梦想,但在刚走出校园的那个阶段,实践梦想的路径并不清晰。在这样的人生状态下,与其过早锁定事业赛道,不如…

    2022年3月20日
    98300
  • 淘宝的商品数据库的结构是怎样的

    淘宝的商品数据库结构设计关键在于能够高效支持大规模商品信息的存储、检索及管理功能。主体答案为:数据库结构包括商品信息表、商品分类表、店铺信息表、用户信息表、订单信息表。商品信息表负责存储商品详情,包含1、商品ID 2、商品名 3、价格 4、库存 5、商品描述 6、图片链接。商品分类表维护商品类别信息…

    2023年11月15日
    3800
  • 给一个get请求如何写测试用例

    步骤:一、确定测试目标;二、确定测试类型;三、确定测试覆盖范围;四、确定测试条件;五、设计测试用例;六、执行测试用例;七、评估测试结果。在设计测试用例之前,需要明确测试目标。测试目标一般是根据软件需求或者用户需求来确定的。 一、确定测试目标 在设计测试用例之前,需要明确测试目标。测试目标一般是根据软…

    2023年3月22日
    12500

发表回复

登录后才能评论
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部