3

私のアプリケーションでは、再生する必要がある LinearPCM 形式のオーディオ データを受信して​​います。私は iOS SpeakHere の例に従っています。ただし、にバッファを提供する方法と場所を取得できませんAudioQueue

iOSでオーディオバッファを再生する実際の例を誰かに教えてもらえますAudioQueueか?

4

1 に答える 1

0

SpeakHere の例では、 を使用して再生を実現してAudioQueueいます。

の設定ではAudioQueue、キューがさらにデータを必要とするときに呼び出される関数が指定されています。

この方法でそれを見ることができます:

void AQPlayer::SetupNewQueue() 

コールバック関数を指定する行は次のとおりです。

    XThrowIfError(AudioQueueNewOutput(&mDataFormat, AQPlayer::AQBufferCallback, this, 
                                    CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &mQueue), "AudioQueueNew failed");

を見るとAQPlayer::AQBufferCallback、どこからデータを取得しているかがわかります。この例では、データはディスク上のファイルに書き出されています。これは、メモリを節約したい場合や、オーディオ ファイルが非常に大きくなる可能性がある場合に適したソリューションです。

とにかく、 を見るとAQPlayer::AQBufferCallback、関数の呼び出しが表示されますAudioFileReadPackets。これが、ディスク上のファイルからオーディオ パケットを読み取るものです。AudioQueue以下を使用するバッファにそれらを直接読み込みます。

    OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(), false, &numBytes, inCompleteAQBuffer->mPacketDescriptions, THIS->GetCurrentPacket(), &nPackets, 
                                       inCompleteAQBuffer->mAudioData);

そのバッファはinCompleteAQBuffer->mAudioData.

最後に、コールバック関数は次のようにバッファーをキューに入れる必要があります。

if (nPackets > 0) {
    inCompleteAQBuffer->mAudioDataByteSize = numBytes;      
    inCompleteAQBuffer->mPacketDescriptionCount = nPackets;     
    AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL);
    THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets);
} 

最初に、再生するパケットがあることを確認する必要があることに注意してください。また、バッファ内のバイト数も指定する必要があります。

次に、この行は次のとおりです。

THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets);

これにより、オーディオ バッファーの全体的な位置が追跡されます。つまり、ファイルからより多くのデータがコピーされるにつれてmCurrentPacket、次のコピーがデータを正しい場所に配置するように転送を配置する必要があります。

于 2012-01-16T18:13:49.380 に答える