音视频开发坑点总结(二)

2,564 阅读3分钟
  • 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 模块进行处理,而且是平台和配置相关

  1. Mac 电脑,使用的是 CoreAudio API,一般情况下使用默认内置的声卡参数 fs=48kHz,stero。
  2. Windows 电脑,WebRTC 中用的是 WASAPI。根据声卡参数不同,采样率等参数可选的比较多,例如有的电脑 builtInAEC 打开后,fs=16kHz,Mono,如果把声卡的 Audio Enhancement 关闭,则输出 fs=48kHz,stero。
  3. Android 一般使用 java 层的 AudioRecord 框架。
  4. 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.  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

代码太多待更新...