Note that there are some explanatory texts on larger screens.

plurals
  1. POAVAssetImageGenerator cancelAllCGImageGeneration doesn't cancelAllCGImageGeneration
    primarykey
    data
    text
    <p>There doesn't seem to be much info around about <code>AVAssetImageGenerator</code> and even less about <code>cancelAllCGImageGeneration</code> so I hope this isn't a bug.</p> <p>I'm calling <code>generateCGImagesAsynchronouslyForTimes</code> and successfully getting frames back and all is good if I let it process the entire file. But when I <code>cancelAllCGImageGeneration</code>...</p> <p>...it takes a while to cancel - which is strange, but no big deal.</p> <p>...it continues to call the completion block for <strong><em>every</em></strong> frame requested, with result <code>AVAssetImageGeneratorCancelled</code> - which seems like an odd design choice and very inconvenient.</p> <p>But the major problem is that after a series of calls with <code>AVAssetImageGeneratorCancelled</code> it starts calling with <code>AVAssetImageGeneratorSucceeded</code> again. Any ideas?</p> <p>(I could workaround this by setting a flag when I cancel, and ignore images after this, but the user can restart the operation with another video so the logic gets confusing. Also I'm getting "out of memory" errors all over the place.)</p> <p>The code:</p> <pre><code>AVURLAsset* asset = [AVURLAsset URLAssetWithURL:self.cameraSelection.movieURL options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]]; NSTimeInterval duration = CMTimeGetSeconds(asset.duration); float fps = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0].nominalFrameRate; int frames = duration * fps; NSMutableArray* requestedTimes = [NSMutableArray array]; for( int i=0; i&lt;frames; i++ ) { [requestedTimes addObject:[NSValue valueWithCMTime:CMTimeMake(i, fps)]]; } assetImageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; assetImageGenerator.requestedTimeToleranceBefore = kCMTimeZero; assetImageGenerator.requestedTimeToleranceAfter = kCMTimeZero; [assetImageGenerator generateCGImagesAsynchronouslyForTimes:requestedTimes completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) { NSString* resultStr; switch (result) { case AVAssetImageGeneratorSucceeded: resultStr = @"AVAssetImageGeneratorSucceeded"; break; case AVAssetImageGeneratorFailed: resultStr = @"AVAssetImageGeneratorFailed"; break; case AVAssetImageGeneratorCancelled: resultStr = @"AVAssetImageGeneratorCancelled"; break; } CFStringRef requestedTimeString = CMTimeCopyDescription(kCFAllocatorDefault, requestedTime); CFStringRef actualTimeString = CMTimeCopyDescription(kCFAllocatorDefault, actualTime); NSLog(@"%@ requestedTime:%@ actualTime:%@ error:%@", resultStr, (NSString*)requestedTimeString, (NSString*)actualTimeString, error); CFRelease(requestedTimeString); CFRelease(actualTimeString); }]; </code></pre> <p>The log:</p> <pre> 2013-07-01 12:23:54.815 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{0/60 = 0.000} actualTime:{0/600 = 0.000} error:(null) 2013-07-01 12:23:54.864 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{1/60 = 0.017} actualTime:{10/600 = 0.017} error:(null) 2013-07-01 12:23:54.894 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{2/60 = 0.033} actualTime:{20/600 = 0.033} error:(null) 2013-07-01 12:23:54.950 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{3/60 = 0.050} actualTime:{30/600 = 0.050} error:(null) 2013-07-01 12:23:54.964 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{4/60 = 0.067} actualTime:{40/600 = 0.067} error:(null) *** CANCEL HERE *** 2013-07-01 12:23:56.137 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{53/60 = 0.883} actualTime:{530/600 = 0.883} error:(null) 2013-07-01 12:23:56.138 ImprovEyes[9114:907] assetImageGenerator cancelAllCGImageGeneration 2013-07-01 12:23:56.210 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{54/60 = 0.900} actualTime:{540/600 = 0.900} error:(null) 2013-07-01 12:23:56.230 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{55/60 = 0.917} actualTime:{550/600 = 0.917} error:(null) *** CONTINUE RECEIVING IMAGES FOR A WHILE THEN STOP *** 2013-07-01 12:23:57.019 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{90/60 = 1.500} actualTime:{900/600 = 1.500} error:(null) 2013-07-01 12:23:57.036 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{91/60 = 1.517} actualTime:{910/600 = 1.517} error:(null) 2013-07-01 12:23:57.046 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{92/60 = 1.533} actualTime:{INVALID} error:(null) 2013-07-01 12:23:57.056 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{93/60 = 1.550} actualTime:{INVALID} error:(null) *** IMAGES START ARRIVING AGAIN! *** 2013-07-01 12:24:01.234 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{538/60 = 8.967} actualTime:{INVALID} error:(null) 2013-07-01 12:24:01.241 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{539/60 = 8.983} actualTime:{INVALID} error:(null) 2013-07-01 12:24:01.249 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{540/60 = 9.000} actualTime:{INVALID} error:(null) 2013-07-01 12:24:01.259 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{541/60 = 9.017} actualTime:{5410/600 = 9.017} error:(null) 2013-07-01 12:24:01.270 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{542/60 = 9.033} actualTime:{5420/600 = 9.033} error:(null) 2013-07-01 12:24:01.279 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{543/60 = 9.050} actualTime:{5430/600 = 9.050} error:(null) ... </pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload