【发布时间】:2020-09-01 18:58:08
【问题描述】:
我到处寻找,找不到解决这个问题的方法。我正在寻找一种方法来更改 AVAudioEngine 将在 macOS 上使用的输入/输出设备。
当简单地播放音频文件时,以下工作按预期工作:
var outputDeviceID:AudioDeviceID = xxx
let result:OSStatus = AudioUnitSetProperty(outputUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &outputDeviceID, UInt32(MemoryLayout<AudioObjectPropertyAddress>.size))
if result != 0 {
print("error setting output device \(result)")
return
}
但是,如果我初始化音频输入(使用let input = engine.inputNode),那么一旦我尝试启动引擎就会出现错误:
AVAEInternal.h:88 所需条件为假:[AVAudioEngine.mm:1055:CheckCanPerformIO: (canPerformIO)]
我知道我的播放代码没问题,因为如果我避免更改输出设备,那么我可以听到麦克风和音频文件,如果我更改输出设备但不初始化 inputNode 文件播放到指定的目的地。
除此之外,我一直在尝试更改输入设备,我从各个地方了解到以下应该这样做:
let result1:OSStatus = AudioUnitSetProperty(inputUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Output, 0, &inputDeviceID, UInt32(MemoryLayout<AudioObjectPropertyAddress>.size))
if result1 != 0 {
print("failed with error \(result1)")
return
}
但是,这不起作用 - 在大多数情况下,它会引发错误 (10853),尽管如果我选择一个同时具有输入和输出的声卡,它会成功 - 当我尝试设置输出或输入节点它实际上是为两者设置设备。
我认为这意味着AVAudioEngine 实例只能处理一个设备,但是它很高兴使用默认设备(麦克风和扬声器/耳机),所以我相信这不是问题。查看一些解决方案,我在网上看到人们只是更改了默认输入,但这并不是一个非常好的解决方案。
有人对这是否可能有任何想法吗?
值得注意的是kAudioOutputUnitProperty_CurrentDevice 是唯一可用的属性,没有等效的kAudioInputUnitProperty_CurrentDevice 键,因为据我了解inputNode 和outputNode 都被归类为“输出单元” "(因为它们都在某处发出声音)。
任何想法都将不胜感激,因为这非常令人沮丧!
谢谢
【问题讨论】:
-
我也用 inputNode.auAudioUnit.setDeviceID(xxx) 试过这个,似乎有同样的问题。据我所知,您只能在以下情况下离开默认音频设备:a)您只输出音频,或 b)您使用一个设备进行输入和输出..
-
您找到解决方案了吗?我遇到了完全相同的问题...
-
收到了苹果的回复 - 会回答的..
标签: swift macos core-audio avaudioengine