我正在使用Matt Gallagher的AudioStreamer来播放mp3音频流。现在我想实时做FFT,并在iPhone上使用OpenGL ES可视化频率。
我想知道在哪里捕获音频数据并将其传递给我的"超级花哨的FFT-Computing-3D-Visual-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 计算。
从音频文件流回调接收的数据直接发送到音频队列,而是可以将其转换为 PCM,运行分析,然后将其馈送到音频队列(作为 PCM)(如果仍需要播放)。要进行转换,您可以使用音频转换器服务(这将是一场无休止的尖叫噩梦)或离线音频队列。
选项 3:查看 iOS 6 上新的音频队列"点击",它可以让您查看队列中的数据。我仍然需要检查一下...它看起来很酷(我在CocoaConf上做了三个星期的演讲,所以,是的......
(转自: http://lists.apple.com/archives/coreaudio-api/2012/Oct/msg00034.html )