ios AVAudioEngine -输入节点的audioAudioUnit更改设备后,输出格式为0通道

bxgwgixi  于 2023-02-06  发布在  iOS
关注(0)|答案(2)|浏览(222)

我正在尝试更改AVAudioEngineinputNode设备。
为此,我在auAudioUnit上调用setDeviceID。虽然此调用没有失败,但输出总线出现了问题。当我询问其格式时,它显示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,  44100 Hz, Float32, 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,  44100 Hz, Float32, 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,  44100 Hz, Float32>
print(avEngine.inputNode.outputFormat(forBus: 0))
// <AVAudioFormat 0x1404ade30:  1 ch,  44100 Hz, Float32>

**编辑:**进一步的调试带来了另一个令人困惑的问题。

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

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

cbwuti44

cbwuti441#

我在模拟器和设备上都遇到了类似的问题。我的inputNode报告了2个通道,但0 hz采样率。原来我是在连接节点之前启动AudioEngine的。将开始移动到最后一步,现在它可以工作了。
我已经写了很多AVAudioEngine应用程序,不敢相信我在我现在的应用程序中犯了这个新手错误。但是,如果苹果能从connect()方法返回一个错误,说明这个问题,而不仅仅是引发一个通用的致命错误,那就太好了。
此外,我使用AudioSession.setPreferredInput代替上面的setDevice.从这里使用enableBuiltInMic方法:
https://developer.apple.com/documentation/avfoundation/avaudiosession/capturing_stereo_audio_from_built-in_microphones

lqfhib0f

lqfhib0f2#

如果这是一个Mac Catalyst的问题,对我来说解决它的方法是确保我已经在应用程序沙箱中勾选了“音频输入”。

相关问题