0

インターネットからオーディオ ファイルをダウンロードし、ダウンロード中に再生できる (ネットワーク バッファーが空の場合はホワイト ノイズを再生する) iPhone アプリケーションを作成しているので、AVAudioPlayer だけを使用することはできず、オーディオ バッファーを自分で埋める必要があると思います。 . ファイルは MP3 形式で、ハードウェアでデコードする必要があります。私の最初の試みは AudioUnit でした:

AudioStreamBasicDescription audioFormat;
bzero(&audioFormat, sizeof(AudioStreamBasicDescription));
audioFormat.mSampleRate = 44100;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mFormatID = kAudioFormatMPEGLayer3;
audioFormat.mFramesPerPacket = 1152;

次にバッファを MP3 パケットで埋めますが、圧縮されたストリームではリモート IO が機能しないため、これは機能しません。そのため、Audio Queue に飛び込むことにしました。

static void HandleOutputBuffer (
    void                *aqData,
    AudioQueueRef       inAQ,
    AudioQueueBufferRef inBuffer
) {
    AQPlayerState *pAqData = (AQPlayerState *) aqData;        // 1
    if (pAqData->mIsRunning == 0) return;                     // 2
    UInt32 numBytesReadFromFile;                              // 3
    UInt32 numPackets = pAqData->mNumPacketsToRead;           // 4
    AudioFileReadPackets (
        pAqData->mAudioFile,
        false,
        &numBytesReadFromFile,
        pAqData->mPacketDescs,
        pAqData->mCurrentPacket,
        &numPackets,
        inBuffer->mAudioData
    );
    if (numPackets > 0) {                                     // 5
        inBuffer->mAudioDataByteSize = numBytesReadFromFile;  // 6
        AudioQueueEnqueueBuffer (
            pAqData->mQueue,
            inBuffer,
            (pAqData->mPacketDescs ? numPackets : 0),
            pAqData->mPacketDescs
        );
        pAqData->mCurrentPacket += numPackets;                // 7
    } else {
        AudioQueueStop (
            pAqData->mQueue,
            false
        );
        pAqData->mIsRunning = false;
    }
}

問題はpAqData->mAudioFile、ハードウェアがこのようにデコードされるかどうかです。もう 1 つの質問は、NSData に格納されている mp3 データを AudioQueueEnqueueBuffer にフィードするにはどうすればよいですか?

4

0 に答える 0