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(投稿されていない)呼び出しコードで返されたブロックバッファを使用して解放していますか?を呼び出した後に に
格納されているオブジェクトを解放しない場合、これはメモリ管理の問題である可能性があります。(Core Foundation スタイルのオブジェクトは ARC に参加しません)&_mp3Control.blockBuffergetMP3Samples:

Allocation & Leaks Instruments を介してコードを実行して、詳細を確認することもできます (ここでは推測しています :))。

于 2013-04-26T05:57:20.790 に答える