我正在通过 AV Foundation 的导出功能从 iPod 库中的曲目中读取 LPCM 样本。我的大部分代码都是从Chris Adamson 的示例中借用的。
我正在设置一个新的CMBlockBufferRef
并保留它CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer
。根据苹果CFType 参考,我需要CFRelease
在我明确保留的任何对象上使用。
问题是我似乎无法弄清楚究竟在哪里释放CMBlockBufferRef
对象。如果我根本不释放它,我会得到很大的内存泄漏。如果我尝试在循环中的任何位置释放它,应用程序会在我的 GrabAudioData 方法中崩溃并出现 EXC_BAD_ACCESS 错误。如果我尝试在循环之外启动并释放它,内存泄漏仍然存在。在发布之前,我已经尝试测试是否为blockBuffer
is 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;
}
}
}