CMSampleBufferRef 内存泄漏

9

我在转换一些音频时遇到了问题。当进行转换时,出现了巨大的内存泄漏,原因是这些代码行。

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?
1个回答

15

答案:已修复 - 只需在if/else语句的末尾添加以下几行即可。

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

1
为什么在 CFRelease 之前要调用 CMSampleBufferInvalidate - Meekohi
@Meekohi,可能没有必要按照这个确切的顺序,我很久以前做过这个,不确定,但我知道那个组合可以完成任务。 - Krzemienski
1
即使在没有使用CMSampleBufferInvalidate和sampleBuffer = NULL的情况下,对示例缓冲区调用CFRelease会导致崩溃。我建议只使用CMSampleBufferInvalidate(nextBuffer); nextBuffer = NULL; - Zigglzworth
需要使用“= nil/null”吗?它是否会进行额外的释放,还是只是为了代码的清晰度和整洁性? - Soylent Graham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接