-
WebRTC编码之前的处理
-
数据采集
-
Audio Unit Processing Graph介绍
-
AEC NS 算法
-
AEC AGC 实现
在 WebRTC 中Audio 数据在被送入编码器之前有 2 大部分需要特别关注,一是数据采集,二是 Audio Processing。
iOS系统提供了多重音频采集的播放接口,包括基于文件的AVAudioRecorder AVAudioPlayer 和AVPlayer,以及基于PCM格式原始音频数据的Audio Unit Processing Graph.
AVAudioRecorder可以吧声音直接录制为本地录音文件,支持mp3等多种格式AVAudioPlayer可以播放本地的mp3等格式的声音录音文件AVPlayer和AVAudioPlayer类似,但是他还能支持播放网络文件提供URL即可播放Audio Unit Processing Graph则提供了实时的PCM原始音频数据处理的能力如果我们要开发类似微信语音消息的功能 每条语音消息就是一个录音文件那么用AVAudioRecorder AVAudioPlayer AVPlayer很合适,对于实时通话功能 比如视频会议用Audio Unit Processing Graph更加合适.
WebRTC用的就是Audio Unit Processing Graph WebRTC用同一个AudioUnit实现了音频采集和播放.根据苹果文档启用硬件Echo抑制
除了音频采集和播放Audio Unit Processing Graph还有更多功能比如混响 混音 格式转换等音频处理功能 实现这些功能需要吧一个或多个AudioUnit组合为一个AUGraph.
数据采集
数据采集主要由 Audio Device 模块进行处理,而且是平台和配置相关
- Mac 电脑,使用的是 CoreAudio API,一般情况下使用默认内置的声卡参数 fs=48kHz,stero。
- Windows 电脑,WebRTC 中用的是 WASAPI。根据声卡参数不同,采样率等参数可选的比较多,例如有的电脑 builtInAEC 打开后,fs=16kHz,Mono,如果把声卡的 Audio Enhancement 关闭,则输出 fs=48kHz,stero。
- Android 一般使用 java 层的 AudioRecord 框架。
- iOS 一般使用 AudioUnit 框架。
另外,数据采集部分,还涉及到 USB 耳机,3.5mm 耳机,蓝牙耳机等外设,这些设备对音频链路上后续的 Audio Processing 也是有影响的,比如增加了 Audio 采集的delay,有 Speech Enhancement 处理的耳机会修改音频频谱,有的耳机外设使用不当可能会导致音频链路没有声音。
Audio Processing
Audio Processing 主要包括 AEC,AGC,NS 等等:
- AEC----Acoustic Echo Cancellation,即回音消除。
- AGC----Automatic Gain Control,即自动增益,用来调整输入信号的音量大小。
- NS----Noise Suppression,即噪音抑制。
从 Audio Devices 输出的数据依次经过 AEC,NS,AGC 等音频处理模块
AEC AGC
AEC:
1.builtInAEC,一般情况下 Windows,Android 系统,builtInAEC 默认会开启。
2.AECM,移动端的回音消除算法,适用于 Android和 iOS。
3.AEC 算法,适用于 Windows/Mac Desktop 的回音消除算法。当然 AEC 也可以用在移动端,某些情况下,回声泄露的性能比 AECM 好。不过最新的 WebRTC 已经把老的 AEC 的 code 移除了。
4.AEC3 算法,Google 对老的 AEC 算法的改版,目前 AEC3 已经全面替代老的 AEC 算法。
AGC:
-
1.Legacy 2.AGCAGC2
Audio Unit Processing Graph内部实现:
创建AudioUnit
componentType设置为kAudioUnitType_Output这个类型可以用来采集,也可以用来播放
componentSubType设置为kAudioUnitSubType_VoiceProcessingIO简称(VPI/O)因为这个子类具备回声消除(AEC)自动增益控制(AGC)功能.
设置回调 采集 播放 播放数据:
-
通过AudioUnitSetProperty函数来对AudioUnit进行操作设置数据格式 设置数据回调
-
VPI/O类型的AudioUnit支持同时进行音频采集和播放但是分两个bus :bus1用于音频采集
(kInputBus)取1 bus用于音频播放(kOutputBus)取0
初始化AudioUnit
初始化VPI/O:
初始化AGC
sample_rate :这个是RTC自己代码获取到采样率如果设备是多核不是4s设置成48000HZ否则设置成16000.
mFormatID:格式常量设置成kAudioFormatLinearPCM 表面是PCM格式
启动AudioUnit
停止AudioUnit
代码太多待更新...