WebRTC由语音引擎,视频引擎和网络传输三大模块组成,其中语音引擎是WebRTC中最具价值的技术之一,实现了音频数据的采集、前处理、编码、发送、接受、解码、混音、后处理、播放等一系列处理流程。

音频工作机制
音频引擎核心类图:


1.音频设备模块AudioDeviceModule主要负责硬件设备层,包括音频数据的采集和播放,以及硬件设备的相关操作。
3.音频3A处理器AudioProcessing主要负责音频采集数据的前处理,包含回声消除AEC、自动增益控制AGC、噪声抑制NS。APM分为两个流,一个近端流,一个远端流。近端(Near-end)流是指从麦克风进入的数据;远端(Far-end)流是指接收到的数据。
5.音频编码器工厂AudioEncodeFactory包含了Opus、iSAC、G711、G722、iLBC、L16等codec。
音频的工作流程图:

2.发起端将采集到的声音信号输送给APM模块,进行回声消除AEC,噪音抑制NS,自动增益控制处理AGC
4.发起端将编码后的数据通过RtpRtcp传输模块发送,通过Internet网路传输到接收端
6.接收端将处理过后的音频数据送入声卡设备进行播放
NetEQ模块是Webrtc语音引擎中的核心模块

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

RecordDataIsAvailbale内部主要流程:
- 由硬件采集过来的音频数据,直接重采样到发送采样率
- 由音频前处理针对重采样之后的音频数据进行3A处理
- VAD处理
- 数字增益调整采集音量
- 音频数据回调外部进行外部前处理
- 混音发送端所有需要发送的音频数据,包括采集的数据和伴音的数据
- 计算音频数据的能量值
- 将其分发到所有的发送Streams
- 混音所有接收到的Streams的音频数据
- 特定条件下,进行噪声注入,用于采集侧作为参考信号
- 对本地伴音进行混音操作
- 数字增益调整播放音量
- 音频数据回调外部进行外部前处理
- 计算音频数据的能量值
- 将音频重采样到请求输出的采样率
- 将音频数据输送给APM作为一路参考信号处理
AudioDeviceModule 播放和采集的数据,总会通过 AudioDeviceBuffer 拿进来或者送出去 10 ms 的音频数据。对于不支持采集和播放 10 ms 音频数据的平台,在平台的AudioDeviceModule 和 AudioDeviceBuffer 还会插入一个 FineAudioBuffer,用于将平台的音频数据格式转换为 10 ms 的 WebRTC 能处理的音频帧。在AudioDeviceBuffer 中,还会10s定时统计一下当前硬件设备过来的音频数据对应的采样点个数和采样率,可以用于检测当前硬件的一个工作状态。
音频相关改动
- 音频Profile的实现,支持Voip和Music 2种场景,实现了采样率、编码码率、编码模式、声道数的综合性技术策略。iOS实现了采集和播放线程的分离,支持双声道的播放。
- 音频3A参数的兼容性下发适配方案。
- 耳机场景的适配,蓝牙耳机和普通耳机的适配,动态3A切换适配。
- Noise_Injection噪声注入算法,作为一路参考信号,在耳机场景的回声消除中的作用特别明显。
- 支持本地伴音文件file和网络伴音文件http&https。
- Audio Nack的实现,提高音频的抗丢包能力,目前正在进行In-band FEC。
- 音频处理在单讲和双讲方面的优化。
- iOS在Built-In AGC方面的研究:
(2)不同机型的麦克风硬件的增益不同,iPhone 7 Plus > iPhone 8 > iPhone X;因此会在软件AGC和硬件AGC都关闭的情况下,远端听到的声音大小表现不一样。
(4)在大部分iOS机型上,外放模式“耳机再次插入后”,input的音量会变小。当前的解决方案是在耳机再次插入后,增加一个preGain来把输入的音量拉回正常值。
音频问题排查

