我正在使用 Matt Gallagher 的 AudioStreamer 播放 mp3 音频流。现在我想在 iPhone 上使用 OpenGL ES 实时进行 FFT 并可视化频率。
我想知道在哪里捕获音频数据并将其传递给我的“Super-Fancy-FFT-Computing-3D-Visualization-Method”。Matt 正在使用 AudioQueue 框架,并且设置了一个回调函数:
err = AudioQueueNewOutput(&asbd, ASAudioQueueOutputCallback, self, NULL, NULL, 0, &audioQueue);
回调看起来像这样:
static void ASAudioQueueOutputCallback(void* inClientData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer){...}
在我从 AudioQueueBufferRef 传递数据的那一刻,结果看起来很奇怪。但是对于 FFT 和可视化,有很多地方可以搞砸,我想确保至少将正确的数据传递给 FFT。我以这种方式从缓冲区读取数据而忽略了每一秒的值,因为我只想分析一个通道:
SInt32* buffPointer = (SInt32*)inBuffer->mAudioData;
int count = 0;
for (int i = 0; i < inBuffer->mAudioDataByteSize/2; i++) {
myBuffer[i] = buffPointer[count];
count += 2;
}
然后使用包含 512 个值的 myBuffer 进行 FFT 计算。