在应该将音频从输入设备传递到输出设备的 Swift 代码中,对象 ID 0 来自哪里?查看错误消息

Where is object id of 0 coming from in this Swift code that is supposed to pass audio from an input device to an output device? See error message

我对此很陌生,正在努力学习,所以如果以下内容不正确,请原谅,但我认为它应该做的是:

func start() {
    let engine = AVAudioEngine()
    
    let inputNode = engine.inputNode
    let outputNode = engine.outputNode
    
    guard let inputUnit: AudioUnit = inputNode.audioUnit else { return }
    guard let outputUnit: AudioUnit = outputNode.audioUnit else { return }
    
    var inputDeviceID: AudioDeviceID = 46  // External input device
    var outputDeviceID: AudioDeviceID = 57  // Mac mini speakers
    
    AudioUnitSetProperty(inputUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &inputDeviceID, UInt32(MemoryLayout<AudioDeviceID>.size))
    AudioUnitSetProperty(outputUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &outputDeviceID, UInt32(MemoryLayout<AudioDeviceID>.size))
    
    let bus = 0
    engine.connect(inputNode, to: outputNode, fromBus: bus, toBus: bus, format: nil)
    
    engine.prepare()
    do {
        try engine.start()
    } catch {
        print("error")
    }
}

当我运行这个时,日志填满:

AudioObjectGetPropertyDataSize: no object with given ID 0
AudioObjectGetPropertyData: no object with given ID 0
AudioObjectGetPropertyDataSize: no object with given ID 0
AudioObjectGetPropertyData: no object with given ID 0
AudioObjectGetPropertyDataSize: no object with given ID 0
AudioObjectGetPropertyData: no object with given ID 0
...

ID 0 是从哪里来的?

如果我注释掉任何一个 AudioUnitSetProperty(...),错误就不会发生。

我做错了什么?

虽然我通常使用 AUAudioUnit:

,但我认为您所做的是正确的
try inputNode.AUAudioUnit.setDeviceID(inputDeviceID)
try outputNode.AUAudioUnit.setDeviceID(outputDeviceID)

不过,我不知道在这种情况下它会有所作为。

以前有一个未记录的限制 AVAudioEngine 限制同时输入和输出到默认系统设备 (https://www.mail-archive.com/coreaudio-api@lists.apple.com/msg01663.html)。我不确定 Big Sur 上是否仍然存在该限制。

一种可能的解决方法(我还没有机会尝试)是创建一个聚合设备,其中包含您想要的输入和输出设备,并将该设备与 AVAudioEngine.[=17 一起使用=]

AudioObjectID 0 是 kAudioObjectUnknown。我怀疑您尝试设置设备失败时导致引擎处于错误状态。