我正在尝试连接到 Spotify 流并使用自定义合成器修改输出。使用很棒的AudioKit会很棒。为了改变输出 Spotify 流,我必须实现这个方法,它可以让我访问 Spotify 的 AUGraph。然后,我可以添加将连接到 Spotify 图形的输入和输出的 AUNode(此处描述得非常好)。
我知道 AudioKit 在内部使用 CoreAudio,但我还没有找到任何方法访问 AKNode 的底层 AUNode(如果有这样的事情)。或者是否有另一种方法可以将 AudioKit AKNode 连接到现有的 AUGraph。
现在我看到 AudioKit 使用了 AVAudioEngine(而不是 EZAudio 中使用的 AUGraph),我可以轻松获取输出和输入节点。所以真正的问题是我是否可以将 AVAudioNode 连接到 AUGraph,或者是否有其他方法可以将 AVAudioNode 转换为 AUNode。
编辑:我试图用这样的简单设置来实现Dmitrii建议,试图修改播放速度:
var engine: AVAudioEngine = AVAudioEngine()
var playback = AVAudioUnitVarispeed()
func connect(outputBus sourceOutputBusNumber: UInt32, ofNode sourceNode: AUNode, toInputBus destinationInputBusNumber: UInt32, ofNode destinationNode: AUNode, inGraph graph: AUGraph, error: NSError?) {
playback.rate = 0.5
engine.attach(playback)
// Connect
engine.connect(playback, to: engine.mainMixerNode, format: nil)
try! engine.start()
var playbackCD = playback.auAudioUnit.componentDescription
var avPlaybackNode = AUNode()
try! AUGraphAddNode(graph, &playbackCD, &avPlaybackNode).checkError(message: "Failed to add playback node")
//Conect source to the mixer input
AUGraphConnectNodeInput(graph, sourceNode, sourceOutputBusNumber, avPlaybackNode, 0)
//Connect mixer output to the device output
AUGraphConnectNodeInput(graph, avPlaybackNode, 0, destinationNode, destinationInputBusNumber)
}
但它对音频输出没有任何影响。不过,它仍然在通过。
结合 AUGraph 和 AVAudioEngine 时,我应该遵循一些特定的生命周期吗?还是我忘记了什么重要的事情?
编辑2:所以我没有按照建议添加节点,我什至不确定是否可以工作。使用 kAudioUnitProperty_MakeConnection 属性连接节点时我更幸运一些:
AUGraphNodeInfo(graph, destinationNode, nil, &destinationUnit)
var connection = AudioUnitConnection(sourceAudioUnit: destinationUnit, sourceOutputNumber: 0, destInputNumber: 0)
try! AudioUnitSetProperty(engine.outputNode.audioUnit!, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, 0, &connection, UInt32(MemoryLayout<AudioUnitConnection>.size)).checkError(message: "Failed to make connection")
try! engine.start()
这会将 AVAudioEngine 的输出节点与 Spotify 的输出连接起来。但是,如果我添加任何中间节点,它就无法播放任何东西。这就像 AVAudioNodes 根本不会连接:
engine.attach(varispeed)
engine.connect(varispeed, to: engine.mainMixerNode, format: nil)
var connection = AudioUnitConnection(sourceAudioUnit: destinationUnit, sourceOutputNumber: 0, destInputNumber: 0)
try! AudioUnitSetProperty(varispeed.audioUnit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, 0, &connection, UInt32(MemoryLayout<AudioUnitConnection>.size)).checkError(message: "Failed to make connection")
try! engine.start()
知道为什么会这样吗?我希望引擎输出单元连接到主混合器,主混合器连接到变速,然后连接到 spotify 的输出。任何帮助将不胜感激。
非常感谢
托马斯