1

这引起了我的注意。我从 iPod 库中读取音频以分析音频样本,我可以做我想做的事,缓冲区总是泄漏,我收到低内存警告,应用程序被杀死。我尝试了所有建议,但没有成功。下面的代码被合并到一个静态库中,读取音频工作正常,只是缓冲区永远不会被释放。我使用ARC并且也尝试不打电话CFRelease但同样的事情......感谢您的任何建议,我完全被卡住了!

- (NSInteger) getMP3Samples:(SInt16*)address{
    AudioBufferList audioBufferList;

    if (_assetReader == nil) {
        return 0;
    }

    _mp3Control.currentSampleBufferCount = 0;
    CMSampleBufferRef nextBuffer =[_assetReaderOutput copyNextSampleBuffer];

    // Is the Song ended
    if (nextBuffer == nil){
        if ([_assetReader status] == AVAssetReaderStatusCompleted) {
            [_assetReader cancelReading];
        }
        _assetReader = nil;
        _assetReaderOutput = nil;
        return _mp3Control.currentSampleBufferCount;
    }

    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
        nextBuffer,
        NULL,
        &audioBufferList,
        sizeof(audioBufferList),
        NULL,
        NULL,
        kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
        &_mp3Control.blockBuffer);

    if (nextBuffer) {
        CMSampleBufferInvalidate(nextBuffer);
        CFRelease(nextBuffer);
        nextBuffer=NULL;
    }

    for (int b=0; b < audioBufferList.mNumberBuffers; b++) {
        memcpy((void *)(address+_mp3Control.currentSampleBufferCount),(void *)audioBufferList.mBuffers[b].mData,audioBufferList.mBuffers[b].mDataByteSize);
        _mp3Control.currentSampleBufferCount+=audioBufferList.mBuffers[b].mDataByteSize;
    }
    ///
    /// Return samples and not bytes!!
    ///
    return _mp3Control.currentSampleBufferCount/2;
}
4

1 回答 1

1

您是否正在使用并释放CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(未发布)调用代码中返回的块缓冲区?
如果您&_mp3Control.blockBuffer在调用后没有释放存储的对象getMP3Samples:,这可能是您的内存管理问题。(Core Foundation 风格的对象不参与 ARC)

您还可以通过 Allocation & Leaks Instruments 运行您的代码以查看更多详细信息(我只是在这里猜测 :))。

于 2013-04-26T05:57:20.790 回答