我正在尝试更改AVAudioEngine
的inputNode
设备。
为此,我在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 ?!
inputNode
和outputNode
共享同一个AUAudioUnit
。并且它的deviceID默认设置为扬声器。这让我很困惑...为什么inpudeNode的设备会是扬声器?
2条答案
按热度按时间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
lqfhib0f2#
如果这是一个Mac Catalyst的问题,对我来说解决它的方法是确保我已经在应用程序沙箱中勾选了“音频输入”。