2012-10-01 25 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。 –