使用 AVAudioEngine 的立体声麦克风直通?

Stereo mic passthrough with AVAudioEngine?

我正在尝试使用 AVAudioEngine 创建一个图形,它从设备麦克风获取输入,并支持立体声输出。

现在图表看起来像这样:

[audioEngine.inputNode] --> [Mic input mixer node] --> [Summing mixer node] --> [audioEngine.mainMixerNode]

由于 audioEngine.inputNode 的输出是 1 ch, 48000 Hz, Float32,我想 运行 通过麦克风后的混音器节点,这样我就可以 a) 将信号发送到多个音频单元,然后 b) 转换为立体声信号以进行更有趣的路由、声像等……

但是,仅当我将 整个图 设置为匹配 1 ch, 48000 Hz, Float32 的输入格式时,音频直通才有效,如下所示:

audioEngine.connect(microphoneNode!, to: microphoneInputMixer, format: inputSessionFormat!)
audioEngine.connect(microphoneInputMixer, to: summingMixer, format: inputSessionFormat!)
audioEngine.connect(summingMixer, to: mainMixerNode!, format: inputSessionFormat!)

我有两个格式变量,单声道 inputSessionFormat 和立体声 outputSettingFormat,即 2 ch, 44100 Hz, Float32, non-inter

据我了解 the docs AVAudioMixerNode 应该处理格式转换,但在这种情况下它拒绝播放音频,除非所有连接都设置为相同(单声道)格式。我也用 AVAudioConnectionPoint 测试了这段代码,但无济于事。

只有AVAudioEngine的inputNode和outputNodes有固定的格式。连接 to/from 这些时使用 nil。混合器将在其输入和输出格式之间隐式转换。使用 nil 连接到 microphoneInputMixer,使用所需格式从 microphoneInputMixer 连接。 mainMixerNode 将采用任何输入格式,无法设置其输出格式。

let desiredFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 2)
audioEngine.connect(microphoneNode!, to: microphoneInputMixer, format:nil)
audioEngine.connect(microphoneInputMixer, to: summingMixer, format: desiredFormat)
audioEngine.connect(summingMixer, to: mainMixerNode!, format: desiredFormat)