2013-10-22 33 views
0

我試圖將視頻轉換爲一系列圖像幀並將其保存到文件。然而,大約5幀後,我收到內存警告,應用程序因內存壓力不久而退出。圖像大小約10kb。我的代碼在下面,我做錯了什麼?保存圖像序列時的內存警告

在此先感謝,本。

-(void)framesFromVideo:(AVURLAsset *)asset{ 
    NSArray *times = [self timeSequenceFromAsset:asset]; 

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *folderPath = rootPath; 

    __block int i=0; 
    generator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; 
    generator.apertureMode = AVAssetImageGeneratorApertureModeCleanAperture; 
    generator.appliesPreferredTrackTransform = TRUE; 
    generator.requestedTimeToleranceBefore = kCMTimeZero; 
    generator.requestedTimeToleranceAfter = kCMTimeZero; 
    [generator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ 

     if (result == AVAssetImageGeneratorSucceeded) { 
      NSString *imgPath = [folderPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.png", i]]; 
      [self writeImageRef:im toPath:imgPath]; 
     }else if (result == AVAssetImageGeneratorFailed){ 
      NSLog(@"Frame generation failed with error:%@", error); 
     }else if (result == AVAssetReaderStatusCancelled){ 
      NSLog(@"Frame generation cancelled"); 
     } 
     NSLog(@"Completed frame"); 
     i++; 
    }]; 
} 
+0

嗨,你有沒有設法解決這個>? – Nil

+0

這是一段時間以來,所以很難記得我做了什麼,但我已經將答案標記爲已接受,所以我認爲我遵循了這一點。我希望你自己解決它 – BenJacob

+0

是的..結果generateCGImagesAsynchronouslyForTimes不是那種記憶效率。所以在我的情況下,我用'CVSampleBuffer'工作。我能夠獲取幀而不是實際的視頻錄製。爲我的目的模製框架,然後從他們製作視頻。感謝您的回覆:) – Nil

回答

0

我遇到了類似的實現這個問題,但我沒有使用完成塊。 要解決我的「內存壓力」,我不得不釋放CGImageRef。

嘗試加入...

CFRelease(im); 

所以......

-(void)framesFromVideo:(AVURLAsset *)asset{ 
    NSArray *times = [self timeSequenceFromAsset:asset]; 

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *folderPath = rootPath; 

    __block int i=0; 
    generator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; 
    generator.apertureMode = AVAssetImageGeneratorApertureModeCleanAperture; 
    generator.appliesPreferredTrackTransform = TRUE; 
    generator.requestedTimeToleranceBefore = kCMTimeZero; 
    generator.requestedTimeToleranceAfter = kCMTimeZero; 
    [generator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ 

     if (result == AVAssetImageGeneratorSucceeded) { 
      NSString *imgPath = [folderPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.png", i]]; 
      [self writeImageRef:im toPath:imgPath]; 
      CFRelease(im); 
     }else if (result == AVAssetImageGeneratorFailed){ 
      NSLog(@"Frame generation failed with error:%@", error); 
     }else if (result == AVAssetReaderStatusCancelled){ 
      NSLog(@"Frame generation cancelled"); 
     } 
     NSLog(@"Completed frame"); 
     i++; 
    }]; 
}