1

我正在通过 AV Foundation 的导出功能从 iPod 库中的曲目中读取 LPCM 样本。我的大部分代码都是从Chris Adamson 的示例中借用的。

我正在设置一个新的CMBlockBufferRef并保留它CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer。根据苹果CFType 参考,我需要CFRelease在我明确保留的任何对象上使用。

问题是我似乎无法弄清楚究竟在哪里释放CMBlockBufferRef对象。如果我根本不释放它,我会得到很大的内存泄漏。如果我尝试在循环中的任何位置释放它,应用程序会在我的 GrabAudioData 方法中崩溃并出现 EXC_BAD_ACCESS 错误。如果我尝试在循环之外启动并释放它,内存泄漏仍然存在。在发布之前,我已经尝试测试是否为blockBufferis 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;
        }
    }    
}
4

2 回答 2

2

blockBuffer 是从 nextBuffer 中保留的,因此应该在 nextBuffer 之前释放它。

于 2012-07-11T06:18:25.610 回答
1

除了@sinn246 的回答,您还必须检查 CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer 的返回:

OSStatus err = CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(nextBuffer, NULL, &bufferList, sizeof(bufferList), NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer);

if (!err && blockBuffer && bufferList.mBuffers[0].mData && (bufferList.mBuffers[0].mDataByteSize > 0))
{
    // Using the AudioBufferList
    bufferManager->GrabAudioData(&bufferList);
}

if (blockBuffer) // Double check that what you are releasing actually exists!
{
    CFRelease(blockBuffer);
}

CMSampleBufferInvalidate(nextBuffer);
CFRelease(nextBuffer);
于 2012-09-27T02:02:22.297 回答