音频处理(AudioUnit)音频阿里巴巴面试

[iOS]关于AudioUnit录音处理回声及遇到的问题

2018-12-30  本文已影响0人  绿问问

需求

本人要做一个录音同时播放音乐的App, 对录音要求较高, 因为要分析噪音情况, 同时去掉播放音乐的回声

录音方案

AudioUnit 来录音并消除回环

我参考了huisedediao的Demo, 在这里简单介绍下几个重点需要注意的

  1. 配置AudioSession, 这是播放音乐或者录音都必须要做的事情, 录音我们选择playAndRecord
  2. 配置AudioComponentDescription, 这里选择VoiceProcessingIO, Description里的对应关系可以看Identifier Keys for Audio Units
    //其中“componentType”和“componentSubType”表示了这个Unit是上面描述的那种类型
    AudioComponentDescription inputcd = {0};
    inputcd.componentType = kAudioUnitType_Output;
    inputcd.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
    inputcd.componentManufacturer = kAudioUnitManufacturer_Apple;
  1. 原本需要通过AUGraph来运行AudioUnit, 我参考的Demo也是, 现在 Apple已经把所有的Audio Unit Progressing Graph ServicesDeprecated了, 所以想实现的朋友可以直接用AudioComponentDescription初始化AUAudioUnit, AudioUnitSetProperty来设置属性, 回调方法, AudioStreamBasicDescription设置采样速率, 通道等来实现

遇到的问题

  1. 播放音乐为什么声音很轻, 有时候用听筒播放?
    录音时设置AVAudioSession时候把option设置Speaker, 如果播放音乐也设置了option, 那么需要后启动录音
  2. 录音断断续续
    录音的AVAudioSession在options设置成Speaker情况下, 如果播放音乐又设置了一遍Speaker会冲突, 虽然是个单例, 但是因为底层是个黑盒, 所以不知道为啥会造成冲突, 最好音乐options设置成mixWithOthers
  3. AVAudioSession在PortOverride为Speaker的情况下, 音乐回环处理无效
    播放音乐的AVAudioSession也选择playAndRecord, 或者把这段代码删除
  4. 系统的回声处理会将低频声音给过滤
    原本我需要实现分析环境噪音, 在使用过后, 环境噪音从原来的60dB变成了40dB, 在研究了消除回声算法后, 发现消除噪音提取有效信息是必须做的
上一篇 下一篇

猜你喜欢

热点阅读