【问题标题】:AudioKit access to underlying CoreAudio nodes (Spotify integration)AudioKit 访问底层 CoreAudio 节点(Spotify 集成)
【发布时间】:2018-03-29 10:05:24
【问题描述】:

我正在尝试连接到 Spotify 流并使用自定义合成器修改输出。使用很棒的AudioKit 会很棒。为了改变输出 Spotify 流,我必须实现这个method,它让我可以访问 Spotify 的 AUGraph。然后,我可以添加将连接到 Spotify 图形的输入和输出的 AUNode(它的描述非常好 here)。

我知道 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 的输出。任何帮助将不胜感激。

非常感谢

托马斯

【问题讨论】:

    标签: spotify core-audio avaudioengine cocoalibspotify-2.0 audiokit


    【解决方案1】:

    AVAudioNode 具有实例属性 AUAudioUnit。另外,你可以得到AudioComponentDescription

    您可以将节点添加到图形并获取 AUNode:

    AUGraphAddNode(graph,
                   yourAudioComponentDescription,
                   outAUNode);
    

    编辑:首先,附加节点,连接它们,然后启动引擎。在CAShow(graph) 之后显示您的日志以检查您的图表。

    【讨论】:

    • 您是否能够使用 audiokit 来更改 spotify 流?我正在尝试做同样的事情。
    猜你喜欢
    • 2016-11-01
    • 1970-01-01
    • 2013-10-10
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多