2

我正在使用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 毫秒内的回调?

4

0 回答 0