首页 文章

AudioKit - 如何从麦克风获取实时floatChannelData?

提问于
浏览
1

我是Audiokit的新手,我正在尝试对来自麦克风的输入音频进行实时数字信号处理 .

我知道我想要的数据是在AKAudioFile的FloatChannelData中,但是如果我想实时获得这个数据怎么办?我目前正在使用AKMicrophone,AKFrequencyTracker,AKNodeOutputPlot,AKBooster,我正在绘制跟踪器的幅度数据 . 但是,该数据与音频信号不同(如您所知,它是RMS) . 有什么方法可以从麦克风中获取信号的Float数据吗?甚至从AKNodeOutputPlot?我只需要读取权限 .

AKSettings.audioInputEnabled = true
mic = AKMicrophone()
plot = AKNodeOutputPlot(mic, frame: audioInputPlot.bounds)
tracker = AKFrequencyTracker.init(mic)
silence = AKBooster(tracker,gain:0)
AudioKit.output = silence
AudioKit.start()

推荐here的创建者:

AKNodeOutputPlot工作,它的一个短文件 . 你基本上只是点击节点并抓取数据 .

如果有一个情节实例(AKNodeOutputPlot),麦克风(AKMicrophone)并希望将这些值输出到标签,我的viewController中的效果如何?

1 回答

  • 1

    使用您想要从中获取数据的节点 . 我在上面的引文中使用了AKNodeOutputPlot,因为它非常简单,只是将该数据用作绘图的输入,但是您可以获取数据并对其执行任何操作 . 在此代码中(来自AKNodeOutputPlot):

    internal func setupNode(_ input: AKNode?) {
        if !isConnected {
            input?.avAudioNode.installTap(
                onBus: 0,
                bufferSize: bufferSize,
                format: nil) { [weak self] (buffer, _) in
    
                    guard let strongSelf = self else {
                        AKLog("Unable to create strong reference to self")
                        return
                    }
                    buffer.frameLength = strongSelf.bufferSize
                    let offset = Int(buffer.frameCapacity - buffer.frameLength)
                    if let tail = buffer.floatChannelData?[0] {
                        strongSelf.updateBuffer(&tail[offset], withBufferSize: strongSelf.bufferSize)
                    }
            }
        }
        isConnected = true
    }
    

    您可以实时获取缓冲区数据 . 在这里,我们只是将它发送到“updateBuffer”,在那里它被绘制,但不是绘图,你会做其他事情 .

相关问题