2012-02-20 80 views
7

所以我在轉換某些音頻時遇到問題。轉換時,我遇到了巨大的內存泄漏,它來自這些代碼行。CMSampleBufferRef內存泄漏

dispatch_queue_t mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL); 
[assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue 
             usingBlock:^
{ 

    while (assetWriterInput.readyForMoreMediaData) 
    { 
     CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer]; 
     if (nextBuffer) 
     { 

      [assetWriterInput appendSampleBuffer: nextBuffer]; 
       nextBuffer = NULL;    

     } 
     else 
     { 
      // done! 
      [assetWriterInput markAsFinished]; 
      [assetWriter finishWriting]; 
      [assetReader cancelReading]; 
      NSDictionary *outputFileAttributes = [[NSFileManager defaultManager] 
                attributesOfItemAtPath:exportPath 
                error:nil]; 





      NSNumber *doneFileSize = [NSNumber numberWithLong:[outputFileAttributes fileSize]]; 
      [self performSelectorOnMainThread:@selector(updateCompletedSizeLabel:) 
            withObject:doneFileSize 
           waitUntilDone:NO]; 

      // release a lot of stuff 
      [assetReader release]; 
      [assetReaderOutput release]; 
      [assetWriter release]; 
      [assetWriterInput release]; 
      [exportPath release]; 
      break; 
     } 
    } 

}]; 

似乎引起泄漏的行是: CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];

我迷失在這一個任何幫助將不勝感激。

答案: 固定 - 只需在if/else語句的末尾添加這些行即可。

CMSampleBufferInvalidate(nextBuffer); 
     CFRelease(nextBuffer); 
     nextBuffer = nil; // NULL? 

回答

12

回答:固定 - 只需在if/else語句的末尾添加這些行即可。

CMSampleBufferInvalidate(nextBuffer); 
CFRelease(nextBuffer); 
nextBuffer = NULL; 
+1

爲什麼在CFRelease之前調用'CMSampleBufferInvalidate'? – Meekohi 2013-10-30 21:32:50

+0

@Meekohi可能不需要這個確切的順序,這是前段時間做的,但我不確定,但我知道組合完成了這項工作。 – Krzemienski 2013-12-18 01:05:52

+1

即使使用沒有CMSampleBufferInvalidate和sampleBuffer = NULL的示例緩衝區,調用CFRelease也會導致崩潰。我建議只使用CMSampleBufferInvalidate(nextBuffer); nextBuffer = NULL; – Zigglzworth 2014-07-06 12:11:19