iOS / Swift:使用AVAudioEngine在每个硬件上录制16khz的音频

时间:2018-03-19 18:37:55

标签: ios swift xcode avaudioengine

我需要录制16,000Hz采样微粒的音频信号。我正在使用AVAudioEngine和Swift:

let input = audioEngine.inputNode
let mixer = AVAudioMixerNode()
audioEngine.attach(mixer)

let format = AVAudioFormat(commonFormat: AVAudioCommonFormat.pcmFormatInt16, sampleRate: 16000.0, channels: 1, interleaved: false)

audioEngine.connect(input, to: mixer, format: input.inputFormat(forBus: 0))            

mixer.installTap(onBus: 0, bufferSize: 2048, format: format) {
            (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in ... }

不幸的是,应用程序因此错误而崩溃:

  

中央] 54:错误:[0x3b281e40]> avae> AVAudioNode.mm:751:AUSetFormat:错误-10868   ***因未捕获的异常终止应用程序' com.apple.coreaudio.avfaudio',原因:'错误-10868'

我做错了什么?

我的想法是使用混音器节点从44100 Hz到16000Hz进行缩减采样。

有没有比使用调音台更好的解决方案?

修改

使用AVAudioCommonFormat.pcmFormatFloat32而不是AVAudioCommonFormat.pcmFormatInt16效果更好。它不会导致错误消息或应用程序崩溃,并且在我的iPhone 5上它甚至会收到正确的声音信号。 但是,在Xcode模拟器(iPhone 7 / iPhone X)中,我只收到0作为样本。我在带有麦克风的模拟器中测试了Siri并且它可以工作,所以麦克风没有坏掉。 可能是什么问题?

1 个答案:

答案 0 :(得分:-1)

我发现唯一可以改变采样率的东西是

AVAudioSettings.sharedInstance().setPreferredSampleRate(...)

不幸的是,尽管似乎8000、12000、16000、22050、44100都可以正常工作,但不能保证将获得所需的采样率。

以下内容无效:

  1. 通过点击engine.inputNode设置我的自定义格式。 (例外)
  2. 添加具有我的自定义格式的混音器,然后点击它。 (例外)
  3. 添加一个混音器,将其与inputNode的格式连接,使用我的自定义格式将混音器连接至主混音器,然后移除outputNode的输入,以免将音频发送到扬声器并获得即时反馈。 (有效,但全为零)
  4. 在AVAudioEngine中根本不使用我的自定义格式,而在单击时使用AVAudioConverter从硬件速率转换。 (未设置缓冲区的长度,无法判断结果是否正确)

这是iOS 12.3.1。