2013-07-01 10 views
2

似乎沒有被周圍約AVAssetImageGenerator甚至更​​少約cancelAllCGImageGeneration所以我希望這不是一個bug很多信息。AVAssetImageGenerator cancelAllCGImageGeneration不cancelAllCGImageGeneration

我打電話給generateCGImagesAsynchronouslyForTimes併成功地取回幀,如果我讓它處理整個文件,一切都很好。但是當我cancelAllCGImageGeneration ...

...它需要一段時間才能取消 - 這很奇怪,但沒什麼大不了的。

...它繼續調用完成塊框架的要求,對結果AVAssetImageGeneratorCancelled - 這似乎是一個奇怪的設計選擇,非常不方便。

但是主要問題是經過AVAssetImageGeneratorCancelled的一系列調用後,它又開始以AVAssetImageGeneratorSucceeded進行調用。有任何想法嗎?

(我可以通過在取消時設置一個標誌來解決這個問題,並在此之後忽略圖像,但用戶可以用另一個視頻重新開始操作,這樣邏輯就會變得混亂。所有的地方)

代碼:

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<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); 
}]; 

日誌:

 
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) 
... 

回答

0

我有同樣的問題,但它仍然處理一些,因爲它們已經在隊列中。

嘗試這樣:

__block BOOL hasErrors = NO; 

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) { 
    if (!hasErrors) { 

     DDLogVerbose(@"ACTUAL GENERATION TIME %f", CMTimeGetSeconds(actualTime)); 

     if (result != AVAssetImageGeneratorSucceeded) { 
      DDLogError(@"Failed to generate thumb: %@", error.localizedDescription); 
      hasErrors = YES; 
      [generator cancelAllCGImageGeneration]; 
      finishBlock(images, YES); 
     } else { 
      [images addObject:[UIImage imageWithCGImage:im]]; 

      if (CMTIME_COMPARE_INLINE(requestedTime, ==, ((NSValue *) timeIntervals.lastObject).CMTimeValue)) { 
       DDLogVerbose(@"Movie composition thumb generation complete"); 
       finishBlock(images, NO); 
      } 
     } 
    } 
}; 
+0

感謝您的答覆,但多打少,我取消後到達是沒有問題的。問題是,幾秒鐘後圖像再次成功地到達。那段時間我正在處理一個不同的視頻,他們混在一起。我結束了使用ffmpeg,這是好的,因爲它不會在App Store上。 –

+0

是的,有錯誤標誌實際上是讓我從一個錯誤後處理那些成功的圖像。很高興你找到了一個方法來做到這一點。 – JADurham909

相關問題