我正在使用APItap
在基于块的回调中获取 PCM 缓冲区样本。AVAudioEngine
我以前使用过 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
在其他地方,有一个视觉组件与我正在 使用的 max( ) 值的变化相一致。
问题是视图的动画和我听到的鼓循环几乎一秒不同步。所以我的问题是,是否AVAudioEngine
根本无法提供在音频源时间甚至 50-100 毫秒内的回调?