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

iOS/Swift:使用AVAudioEngine在每个硬件上录制16khz的音频,ios,swift,xcode,avaudioengine,Ios,Swift,Xcode,Avaudioengine,我需要从一个16000Hz采样的微音器中录制一个音频信号。我正在使用AVAudioEngine和Swift: let input = audioEngine.inputNode let mixer = AVAudioMixerNode() audioEngine.attach(mixer) let format = AVAudioFormat(commonFormat: AVAudioCommonFormat.pcmFormatInt16, sampleRate: 16000.0, chann

我需要从一个16000Hz采样的微音器中录制一个音频信号。我正在使用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 ... }
不幸的是,应用程序因以下错误而崩溃:

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

我做错了什么

我的想法是使用混频器节点将采样频率从44100 Hz降到16000 Hz

有比使用混合器更好的解决方案吗

编辑:

使用AVAudioCommonFormat.pcmFormatFloat32代替AVAudioCommonFormat.pcmFormat16效果更好。它不会导致错误信息或应用程序崩溃,在我的iPhone 5上,它甚至接收到正确的声音信号。 然而,在Xcode模拟器(iPhone7/iPhoneX)中,我只收到0作为示例。我用麦克风在模拟器中测试了Siri,它工作了,所以麦克风没有损坏。
有什么问题吗?

我发现改变采样率唯一有效的方法是

AVAudioSettings.sharedInstance().setPreferredSampleRate(...)
不幸的是,虽然8000、12000、16000、22050、44100似乎都有效,但无法保证您将获得所需的采样率

以下情况不起作用:

  • 在tap off engine.inputNode中设置我的自定义格式。(例外)
  • 添加一个具有我的自定义格式的混音器并点击该混音器。(例外)
  • 添加混音器,将其连接到inputNode的格式,将混音器连接到使用我的自定义格式的主混音器,然后删除outputNode的输入,以便不将音频发送到扬声器并获得即时反馈。(工作正常,但全部为零)
  • 在AVAudioEngine中根本不使用我的自定义格式,并使用AVAudioConverter从我的tap中的硬件速率转换。(未设置缓冲区的长度,无法判断结果是否正确)
  • 这与iOS 12.3.1相同。