objective-c - 何时释放CMBlockBufferRef?

标签 objective-c ios avfoundation

我正在通过AV Foundation的导出功能从iPod库中的轨道读取LPCM样本。我的大部分代码都是从Chris Adamson's example here借用的。

我正在设置一个新的CMBlockBufferRef,并使用CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer保留它。根据苹果的CFType reference,我需要在我明确保留的任何对象上使用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;
        }
    }    
}

最佳答案

除了@ 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);

关于objective-c - 何时释放CMBlockBufferRef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143359/

相关文章:

iOS 下载多个图像和更新 UIProgressView 时出现一些问题

ios - 如何使用 Objective-C 填写 HTML 表单

ios - Swift - 如何根据视频播放器帧的大小动态调整 UIView 的大小

iphone - 使用 AVMutableVideoCompositionLayerInstruction 旋转视频

ios - 尝试通过 ACAccount 和 SLRequest 访问 Facebook 时的 invalid_token

objective-c - 如何为 iAd 创建全局引用并在多个 Viewcontroller 中实现

ios - UIScrollView 的正确使用方法是什么?

ios - 从同一部 iPhone 获取两个不同的设备 ID

ios - 使用 AutoLayout 缩小 UIImageView 高度

ios - UIPinchGestureRecognizer 缩放 AVCaptureConnection;不按比例缩小