AV Foundationのエクスポート機能を使用して、iPodライブラリのトラックからLPCMサンプルを読み取っています。私のコードのほとんどは、ここにあるChrisAdamsonの例から借用しています。
私は新しいものを設定し、CMBlockBufferRef
それをで保持していCMSampleBufferGetAudioBufferListWithRetainedBlockBuffer
ます。アップルのCFTypeリファレンスによると、CFRelease
明示的に保持しているオブジェクトで使用する必要があります。
CMBlockBufferRef
問題は、オブジェクトをどこから正確に解放するかがわからないように見えることです。まったくリリースしないと、大きなメモリリークが発生します。ループ内のどこかでリリースしようとすると、GrabAudioDataメソッドでEXC_BAD_ACCESSエラーが発生してアプリがクラッシュします。ループの外で開始して解放しようとしても、メモリリークはまだ残っています。blockBuffer
リリースする前に、であるかどうかをテストしてみましたNULL
が、機能しません。助けてください!
while (assetReader.status != AVAssetReaderStatusCompleted)
{
if (assetReader.status == AVAssetReaderStatusReading)
{
CMSampleBufferRef nextBuffer = [readerOutput copyNextSampleBuffer];
if (nextBuffer)
{
AudioBufferList bufferList;
CMBlockBufferRef blockBuffer;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(nextBuffer, NULL, &bufferList, sizeof(bufferList), NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer);
// Using the AudioBufferList
bufferManager->GrabAudioData(&bufferList);
CMSampleBufferInvalidate(nextBuffer);
CFRelease(nextBuffer);
// Releasing here causes a crash
// CFRelease(blockBuffer);
}
else
{
break;
}
}
}