似乎沒有被周圍約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) ...
感謝您的答覆,但多打少,我取消後到達是沒有問題的。問題是,幾秒鐘後圖像再次成功地到達。那段時間我正在處理一個不同的視頻,他們混在一起。我結束了使用ffmpeg,這是好的,因爲它不會在App Store上。 –
是的,有錯誤標誌實際上是讓我從一個錯誤後處理那些成功的圖像。很高興你找到了一個方法來做到這一點。 – JADurham909