AVAudioEngine - 更改 inputNode 的 auAudioUnit 设备后,输出格式有 0 个声道

问题描述

我正在尝试更改 inputNodeAVAudioEngine 的设备。

为此,我在其 setDeviceID 上调用 auAudioUnit。虽然这个调用没有失败,但输出总线发生了一些错误。 当我询问它的格式时,它显示了 0Hz 和 0 通道格式。当我尝试将节点连接到 mainMixerNode 时,它​​会使应用程序崩溃。

谁能解释一下这段代码有什么问题?

avEngine = AVAudioEngine()

print(avEngine.inputNode.auAudioUnit.inputBusses[0].format)
// <AVAudioFormat 0x1404b06e0:  2 ch,44100 Hz,Float32,non-inter>
print(avEngine.inputNode.auAudioUnit.outputBusses[0].format)
// <AVAudioFormat 0x1404b0a60:  2 ch,inter>
        

// Now,let's change a device from headphone's mic to built-in mic.
try! avEngine.inputNode.auAudioUnit.setDeviceID(inputDevice.deviceID)
        

print(avEngine.inputNode.auAudioUnit.inputBusses[0].format)
// <AVAudioFormat 0x1404add50:  2 ch,non-inter>
print(avEngine.inputNode.auAudioUnit.outputBusses[0].format)
// <AVAudioFormat 0x1404adff0:  0 ch,0 Hz,'lpcm' (0x00000029) 32-bit little-endian float,deinterleaved>
// !!!

        
// Interestingly,'inputNode' shows a different format than `auAudioUnit`
print(avEngine.inputNode.inputFormat(forBus: 0))
// <AVAudioFormat 0x1404af480:  1 ch,Float32>
print(avEngine.inputNode.outputFormat(forBus: 0))
// <AVAudioFormat 0x1404ade30:  1 ch,Float32>

编辑: 进一步的调试揭示了另一个令人费解的事情。

avEngine.inputNode.auAudioUnit == avEngine.outputNode.auAudioUnit // this is true ?!

inputNodeoutputNode 共享同一个 AUAudioUnit。它的 deviceID 默认设置为扬声器。这让我很困惑……为什么 inpudeNode 的设备会是扬声器?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)