我正在尝试使用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具有固定格式。连接到/来自这些时使用nil
。混音器将隐式地在输入和输出格式之间进行转换。使用microphoneInputMixer
连接nil
,使用所需格式连接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)