2012-10-01 43 views
1

我正在使用Matt Gallagher的AudioStreamer播放mp3音频流。现在我想要实时进行FFT并使用iPhone上的OpenGL ES对频率进行可视化。iPhone AudioStreamer AudioQueue实时FFT

我不知道在哪里捕捉音频数据并将它传递给我的“超级花式-FFT-计算-3D可视化法”。马特是使用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; 
} 

然后如下FFT运算用含有512个值myBuffer。

+0

我只是发现了它使用Matt的AudioStreamer中的代码在某个时刻捕获PCM数据是不可能的。数据以压缩格式传递给AudioQueue。但我要继续我的研究,必须有一种方法... –

+0

更正:这是不可能的:) –

回答

3

而不是发送你将从音频文件流回调直接接收到音频队列中的数据,你可以将其转换为PCM,运行分析,然后将其提供给音频队列(如PCM),如果您还需要玩它。要进行转换,您可以使用音频转换服务(这将是一个没有结束的尖叫恶梦),或者一个离线音频队列。

选项3:查看iOS 6上的新音频队列“tap”,它可以让您查看队列中的数据。我还需要检查了这一点......它看起来很酷(我做讲座就可以在CocoaConf三个星期里,所以,是啊...)

(从转贴:http://lists.apple.com/archives/coreaudio-api/2012/Oct/msg00034.html

+0

音频队列“点击”是绝对的提示!它还不是iOS 6文档的一部分,但您可以在头文件AudioQueue.h中找到所需的所有内容。只需查找AudioQueueProcessingTap。 –