インターネットからオーディオ ファイルをダウンロードし、ダウンロード中に再生できる (ネットワーク バッファーが空の場合はホワイト ノイズを再生する) 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 にフィードするにはどうすればよいですか?