在应该将音频从输入设备传递到输出设备的 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
我对此很陌生,正在努力学习,所以如果以下内容不正确,请原谅,但我认为它应该做的是:
- 初始化一个输入输出节点
- 为每个节点创建一个音频单元
- 为每个音频单元分配一个特定设备 ID 的“CurrentDevice”
- 连接输入和输出
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
。我怀疑您尝试设置设备失败时导致引擎处于错误状态。
我对此很陌生,正在努力学习,所以如果以下内容不正确,请原谅,但我认为它应该做的是:
- 初始化一个输入输出节点
- 为每个节点创建一个音频单元
- 为每个音频单元分配一个特定设备 ID 的“CurrentDevice”
- 连接输入和输出
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
。我怀疑您尝试设置设备失败时导致引擎处于错误状态。