首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioKit tap在时间间隔内跳过

AudioKit tap在时间间隔内跳过
EN

Stack Overflow用户
提问于 2017-11-04 16:09:13
回答 1查看 292关注 0票数 3

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

tap代码看起来像这样(去掉内部,简单地跟踪将处理的样本数):

代码语言:javascript
复制
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

    }
}

我使用以下命令初始化分路器:

代码语言:javascript
复制
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,因此丢失了大量时间。我怀疑样本缓冲区的处理时间可能过长,所以...

我简化了代码,以便简单地跟踪有多少样本被传递到水龙头。在代码的另一部分中,我简单地打印出sampleCount/elapsedTime,正如'bufferSize‘后面的注释中所指出的,我每秒获得不同数量的样本。

使用16K缓冲区时,采样率收敛于43.1K样本/秒,而使用1K缓冲区时,采样率仅收集约20%的样本。我更喜欢使用较小的缓冲区大小来获得对检测到的声音的近乎实时的响应。在我写这篇文章的时候,4K buffer版本一直在运行,并且稳定在每秒39678个样本。

我是不是遗漏了什么?缓冲器大小较小的tap能否实际捕获44.1 Khz样本数据?

EN

回答 1

Stack Overflow用户

发布于 2017-11-12 03:52:06

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

代码语言:javascript
复制
buffer.frameLength = self.bufferSize

..。突然所有的样本都出现了。显然,我从我显然不理解的代码中去掉了一些代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47108769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档