2011-04-01 91 views
4

在XCode中運行Instruments時,有人能幫助我追蹤這些CoreVideo內存泄漏嗎?iOS CoreVideo內存泄漏

基本上,當我按下自定義運動JPEG播放器上的「錄製視頻」按鈕時,會發生內存泄漏。由於Leaks Instruments沒有指向我的任何呼叫,因此我無法確切知道我的代碼的哪個部分在泄漏。順便說一句,我正在使用iPad設備來測試泄漏。

繼承人從泄漏儀器消息:

  • 負責圖書館= corevideo的
  • 負責任的框架: CVPixelBufferBacking :: initWithPixelBufferDescription(..) CVObjectAlloc(...) CVBuffer :: init()

這是我的代碼,它處理每個運動jpeg幀s服務器treamed:

-(void)processServerData:(NSData *)data{  

/* 
//render the video in the UIImage control 
*/ 
UIImage *image =[UIImage imageWithData:data]; 
self.imageCtrl.image = image; 

/* 
//check if we are recording 
*/ 
if (myRecorder.isRecording) { 

    //create initial sample: todo:check if this is still needed 
    if (counter==0) { 

     self.buffer = [Recorder pixelBufferFromCGImage:image.CGImage size:myRecorder.imageSize]; 
     CVPixelBufferPoolCreatePixelBuffer (NULL, myRecorder.adaptor.pixelBufferPool, &buffer); 

     if(buffer) 
     { 
      CVBufferRelease(buffer); 
     } 
    } 

    if (counter < myRecorder.maxFrames) 
    { 
     if([myRecorder.writerInput isReadyForMoreMediaData]) 
     { 
      CMTime frameTime = CMTimeMake(1, myRecorder.timeScale); 
      CMTime lastTime=CMTimeMake(counter, myRecorder.timeScale); 
      CMTime presentTime=CMTimeAdd(lastTime, frameTime); 

      self.buffer = [Recorder pixelBufferFromCGImage:image.CGImage size:myRecorder.imageSize]; 

      [myRecorder.adaptor appendPixelBuffer:buffer withPresentationTime:presentTime]; 

      if(buffer) 
      { 
       CVBufferRelease(buffer); 
      } 

      counter++; 

      if (counter==myRecorder.maxFrames) 
      { 
       [myRecorder finishSession]; 

       counter=0; 
       myRecorder.isRecording = NO; 
      } 
     } 
     else 
     { 
      NSLog(@"adaptor not ready counter=%d ",counter); 
     } 
    } 
} 

}

這裏的pixelBufferFromCGImage功能:

+ (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image size:(CGSize) size{ 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, 
         [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, 
         nil]; 
CVPixelBufferRef pxbuffer = NULL; 

CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, size.width, 
             size.height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options, 
             &pxbuffer); 
NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL); 

CVPixelBufferLockBaseAddress(pxbuffer, 0); 
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); 
NSParameterAssert(pxdata != NULL); 

CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(pxdata, size.width, 
              size.height, 8, 4*size.width, rgbColorSpace, 
              kCGImageAlphaNoneSkipFirst); 
NSParameterAssert(context); 
CGContextConcatCTM(context, CGAffineTransformMakeRotation(0)); 
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
             CGImageGetHeight(image)), image); 
CGColorSpaceRelease(rgbColorSpace); 
CGContextRelease(context); 

CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 

return pxbuffer; 

}

Aprpeciate任何幫助!謝謝

+0

你是怎麼檢查泄漏的?通過儀器?我的應用在使用400MB內存後退出,我在XCode調試器中看到這個原因:由於內存問題終止 – Nil 2017-07-05 15:28:42

回答

2

我重構了processFrame方法,我不再泄漏。

-(void) processFrame:(UIImage *) image { 

    if (myRecorder.frameCounter < myRecorder.maxFrames) 
    { 
     if([myRecorder.writerInput isReadyForMoreMediaData]) 
     { 
      CMTime frameTime = CMTimeMake(1, myRecorder.timeScale); 
      CMTime lastTime=CMTimeMake(myRecorder.frameCounter, myRecorder.timeScale); 
      CMTime presentTime=CMTimeAdd(lastTime, frameTime); 

      buffer = [Recorder pixelBufferFromCGImage:image.CGImage size:myRecorder.imageSize]; 

      if(buffer) 
      { 
       [myRecorder.adaptor appendPixelBuffer:buffer withPresentationTime:presentTime]; 

       myRecorder.frameCounter++; 

       CVBufferRelease(buffer); 

       if (myRecorder.frameCounter==myRecorder.maxFrames) 
       { 
        [myRecorder finishSession]; 

        myRecorder.frameCounter=0; 
        myRecorder.isRecording = NO; 
       } 
      } 
      else 
      { 
       NSLog(@"Buffer is empty"); 
      } 
     } 
     else 
     { 
      NSLog(@"adaptor not ready frameCounter=%d ",myRecorder.frameCounter); 
     } 
    } 

} 
0

我沒有看到任何太明顯。我注意到你在這裏使用self.buffer和buffer。如果它被保留,你可能會在那裏泄漏。如果CVPixelBufferPoolCreatePixelBuffer在self.buffer保留在第一行後在第二行中分配內存,則第一行可能會泄漏。

self.buffer = [Recorder pixelBufferFromCGImage:image.CGImage size:myRecorder.imageSize]; 
    CVPixelBufferPoolCreatePixelBuffer (NULL, myRecorder.adaptor.pixelBufferPool, &buffer); 

希望有幫助。

+0

我嘗試從self.buffer中刪除「self」,但仍有內存泄漏。謝謝 – German 2011-04-01 22:16:30