如何从AVAudioEngine的installTap高频获取buffer
how to get buffer from AVAudioEngine's installTap at high frequency
我希望在屏幕上呈现音频波形,例如 iOS 语音备忘录应用程序,因此我使用 AVAudioEngine 并在输入节点上安装了 Tap。但它以 0.1 秒的频率提供最快的回调,我需要以更快的频率获取缓冲区数据,以便可以在屏幕上绘制越来越多的波形以实现流畅和实时的可视化。
你能建议更好的方法吗?
let inputNode = self.audioEngine!.inputNode
let format = 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
}
}
我认为你误解了如何处理这个问题。与其以高频率获取非常少量的新数据,您应该分解代码以在更长的时间间隔内获取更大的数据块。
然后您可以设置显示代码以启动动画,以便在给定的时间间隔内在新数据的图形中进行动画处理。 1/10秒对于一个动画来说其实是一个很短的时间间隔。
我建议对 1/10 秒时间间隔的数据幅度进行平均,然后将新的平均数据动画化到位。
顺便说一句,请参阅 关于创建数据动画图的内容。
我想出的动画是这样的:
我希望在屏幕上呈现音频波形,例如 iOS 语音备忘录应用程序,因此我使用 AVAudioEngine 并在输入节点上安装了 Tap。但它以 0.1 秒的频率提供最快的回调,我需要以更快的频率获取缓冲区数据,以便可以在屏幕上绘制越来越多的波形以实现流畅和实时的可视化。
你能建议更好的方法吗?
let inputNode = self.audioEngine!.inputNode
let format = 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
}
}
我认为你误解了如何处理这个问题。与其以高频率获取非常少量的新数据,您应该分解代码以在更长的时间间隔内获取更大的数据块。
然后您可以设置显示代码以启动动画,以便在给定的时间间隔内在新数据的图形中进行动画处理。 1/10秒对于一个动画来说其实是一个很短的时间间隔。
我建议对 1/10 秒时间间隔的数据幅度进行平均,然后将新的平均数据动画化到位。
顺便说一句,请参阅
我想出的动画是这样的: