iPhone AudioStreamer AudioQueue 实时 FFT

Posted

技术标签:

【中文标题】iPhone AudioStreamer AudioQueue 实时 FFT【英文标题】:iPhone AudioStreamer AudioQueue Realtime FFT 【发布时间】:2012-10-01 13:02:38 【问题描述】:

我正在使用 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 计算。

【问题讨论】:

我刚刚发现使用 Matt 的 AudioStreamer 中的代码无法在某个时间点捕获 PCM 数据。数据以压缩格式传递给 AudioQueue。但我要继续研究,一定有办法…… 更正:不可能:) 【参考方案1】:

除了将您从音频文件流回调接收到的数据直接发送到音频队列之外,您还可以将其转换为 PCM,运行您的分析,然后将其馈送到音频队列(作为 PCM)(如果您仍然需要)玩。要进行转换,您可以使用音频转换器服务(这将是一场永无止境的尖叫噩梦)或离线音频队列。

选项 3:查看 iOS 6 上的新音频队列“点击”,它可以让您查看队列中的数据。我仍然需要检查一下……它看起来很酷(我将在 CocoaConf 上发表三周的演讲,所以,是的……)

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

【讨论】:

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

以上是关于iPhone AudioStreamer AudioQueue 实时 FFT的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:应用程序在后台播放音乐

AudioStreamer在iOS5中无法在后台运行。有什么建议?

是否可以扩展 Matt Gallagher 的 AudioStreamer 框架以播放 MP3 以外的其他格式?

如何识别 AudioStreamer isBuffering 状态还是 As_Waiting_for_queue_to_start 状态?

Audi ATOM 컨셉트카~

「第25小时计画」?零塞车计画?Audi做出未来城市的概念