1

MattGallagherのAudioStreamerを使用してmp3オーディオストリームを再生しています。次に、リアルタイムでFFTを実行し、iPhoneでOpenGLESを使用して周波数を視覚化します。

オーディオデータをどこでキャッチして「Super-Fancy-FFT-Computing-3D-Visualization-Method」に渡すのか疑問に思っています。MattはAudioQueueFrameworkを使用しており、次のように設定されたコールバック関数があります。

err = AudioQueueNewOutput(&asbd, ASAudioQueueOutputCallback, self, NULL, NULL, 0, &audioQueue);

コールバックは次のようになります。

static void ASAudioQueueOutputCallback(void*                inClientData, 
                                AudioQueueRef           inAQ, 
                                AudioQueueBufferRef     inBuffer){...}

現時点では、AudioQueueBufferRefからデータを渡していますが、結果は非常に奇妙に見えます。しかし、FFTと視覚化では、それを台無しにする可能性のあるポイントが非常に多いため、少なくとも適切なデータをFFTに渡すようにしたかったのです。1つのチャネルのみを分析したいので、1秒おきの値を無視してこの方法でバッファからデータを読み取っています。

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計算に従います。

4

1 に答える 1

3

オーディオファイルストリームコールバックから受け取ったデータをオーディオキューに直接送信する代わりに、データをPCMに変換して分析を実行し、それを再生する必要がある場合は、オーディオキューに(PCMとして)フィードすることができます。変換を行うには、オーディオコンバータサービス(終わりのない悲鳴を上げる悪夢になります)、またはオフラインオーディオキューを使用できます。

オプション3:iOS 6の新しいオーディオキューの「タップ」を調べます。これにより、キュー内のデータを確認できます。私はまだこれをチェックする必要があります…それはかっこいいようです(そして私はCocoaConfで3週間それについて話をしているので、ええ…)

(再投稿:http://lists.apple.com/archives/coreaudio-api/2012/Oct/msg00034.html

于 2012-10-04T18:12:34.110 に答える