【问题标题】:how to get buffer from AVAudioEngine's installTap at high frequency如何以高频从 AVAudioEngine 的 installTap 中获取缓冲区
【发布时间】:2021-08-12 02:39:42
【问题描述】:

我希望像 iOS 语音备忘录应用一样在屏幕上渲染音频波形,所以我使用 AVAudioEngine 并在输入节点上安装了 Tap。但它在 0.1 秒的频率上给出了最快的回调,我需要以更快的频率获取缓冲数据,以便可以在屏幕上绘制越来越多的波形以实现流畅和实时的可视化。

您能推荐更好的方法吗?

让 inputNode = self.audioEngine!.inputNode 让格式 = inputNode.inputFormat(forBus: 0)

    inputNode.installTap(onBus: 0, bufferSize: 4096, format: format) { [self] (buffer, time) in
    
        processAudioData(buffer: buffer)
        DispatchQueue.main.async {
            audioPlotView.setNeedsDisplay(). // Render waveform on screen
        }
    } 

【问题讨论】:

    标签: swift avaudioengine


    【解决方案1】:

    我认为你误解了如何处理这个问题。与其以高频率获取非常少量的新数据,不如将代码分解为在更长的时间间隔内获取更大的数据块。

    然后,您可以设置显示代码以启动动画,以便在给定的时间间隔内以新数据的图表形式制作动画。对于动画来说,1/10 秒实际上是一个相当短的时间间隔。

    我建议对 1/10 秒时间间隔内的数据幅度进行平均,并将新的平均数据设置为动画。

    顺便说一句,请参阅 update I posted to the answer to your question 关于创建数据的动画图。

    我想出的动画是这样的:

    【讨论】:

    • 感谢 Ducan 的代码,这对建立理解很有帮助……这里我们也需要在波形上来回滚动,所以我做了更多的研究,发现 UIScrollView 对此有帮助。所以现在我在内容视图的图层上渲染线条并更改内容视图框架以将其移回并创建内容视图宽度,并相应地更改滚动视图内容大小和内容偏移量,请让我知道您的意见。以下是观看演示输出视频的链接。 github.com/singham2012/audio/blob/main/README.md
    猜你喜欢
    • 2020-12-19
    • 2013-06-24
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多