我使用tap
在AVAudioEngine
API中的基于块的回调中获取PCM缓冲区样本。我之前使用的是Core-Audio,但是复杂性和难以逾越的大量记录的c代码驱使我使用这个基于AVFoundation的框架。
我有这样的代码:
[self startEngine];
[_player play];
[mainMixer installTapOnBus:0 bufferSize:256 format:[mainMixer outputFormatForBus:0] block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when) {
[buffer setFrameLength:256];
float * const p = *(buffer.floatChannelData);
float sum = 0;
for (int i = 0; i < buffer.frameLength; i+=buffer.stride) {
if (p[i] > sum) {
sum = p[i];
}
}
我只是开始一个鼓循环并捕获每个回调中最高值的浮点数。在其他地方,有一个可视组件与我正在采用的最大值(sum
)的变化值一起动画。
问题是我听到的视图和鼓循环的动画几乎是不同步的。所以我的问题是AVAudioEngine
是否从根本上无法提供甚至在音频源时间50-100ms内的回调?