AudioKit点按时间间隔跳过

时间:2017-11-04 08:09:13

标签: swift xcode audiokit

我正在构建一个使用麦克风输入来检测声音和触发事件的应用。我的代码基于AKAmplitudeTap,但是当我运行它时,我发现我只是获取缺少部分的间隔的样本数据。

点击代码看起来像这样(胆量被撕掉,只是跟踪将要处理的样本数量):

open class MyTap {
//   internal let bufferSize: UInt32 = 1_024  // 8-9 kSamples/sec
     internal let bufferSize: UInt32 = 4096   // 39.6 kSamples/sec   
//   internal let bufferSize: UInt32 = 16536  // 43.3 kSamples/sec

public init(_ input: AKNode?) {
    input?.avAudioNode.installTap(onBus: 0, bufferSize: bufferSize, format: nil ) { buffer, _ in

        sampleCount += self.bufferSize

    }
}

我用以下内容初始化水龙头:

func afterLoad() {
    assert(!loaded)
    AKSettings.audioInputEnabled = true
    do {
        try AKSettings.setSession(category: .playAndRecord, with: .allowBluetoothA2DP)
    } catch {
        print("Could not set session category.")
    }
    mic = AKMicrophone()
    myTap = MyTap(mic)  // seriously, can it be that easy?  

    loaded = true
}

原始的tap代码是将样本捕获到缓冲区,但是我看到大量的时间丢失了,缓冲区大小为1024.我怀疑样本缓冲区的处理时间可能过长,所以... < / p>

我简化了代码,只是简单地跟踪传递给tap的样本数量。在代码的另一部分中,我只是打印出sampleCount / elapsedTime,并且如“bufferSize&#39;之后的注释中所述”。我每秒得到不同数量的样本。

采样速率在16K缓冲液下以43.1 KSamples / sec收敛,并且仅使用1K缓冲液收集约20%的样品。我宁愿使用小缓冲区大小来获得对检测到的声音的近实时响应。正如我写的那样,4K缓冲版本已经运行并稳定在39678个样本/秒。

我错过了什么吗?具有小缓冲区大小的抽头实际上可以捕获44.1 Khz样本数据吗?

1 个答案:

答案 0 :(得分:1)

问题已解决......水龙头需要这行代码

buffer.frameLength = self.bufferSize

...突然出现了所有样本。我显然从代码中删除了一些代码,我显然不明白。