不能让AVAssetImageGenerator给我一部电影的所有帧

我不能让AVAssetImageGenerator给我一部电影的所有帧。

使用此代码:

 NSString *path = [[NSBundle mainBundle] pathForResource:@"video" ofType:@"mov"]; NSURL *url=[NSURL fileURLWithPath:path]; NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; self.asset=[[AVURLAsset alloc] initWithURL:url options:options]; NSMutableArray *thumbTimes=[NSMutableArray arrayWithCapacity:asset.duration.value]; for(int t=0;t < asset.duration.value;t++) { CMTime thumbTime = CMTimeMake(t,asset.duration.timescale); NSValue *v=[NSValue valueWithCMTime:thumbTime]; [thumbTimes addObject:v]; } self.generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; self.generator.appliesPreferredTrackTransform=TRUE; self.generator.requestedTimeToleranceAfter=kCMTimeZero; self.generator.requestedTimeToleranceBefore=kCMTimeZero; AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ if (result != AVAssetImageGeneratorSucceeded) { NSLog(@"couldn't generate thumbnail, error:%@", error); } NSLog(@"actual time: %lld/%d (requested: %lld/%d)",actualTime.value,actualTime.timescale,requestedTime.value,requestedTime.timescale); }; CGSize maxSize = CGSizeMake(320, 180); generator.maximumSize = maxSize; [generator generateCGImagesAsynchronouslyForTimes:thumbTimes completionHandler:handler]; 

我明白了:

 2012-04-19 18:55:06.801 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 0/600) 2012-04-19 18:55:07.836 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 1/600) 2012-04-19 18:55:08.314 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 2/600) 2012-04-19 18:55:09.350 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 3/600) 2012-04-19 18:55:10.186 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 4/600) 2012-04-19 18:55:11.257 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 5/600) 2012-04-19 18:55:11.697 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 6/600) 2012-04-19 18:55:12.246 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 7/600) 2012-04-19 18:55:13.255 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 8/600) 2012-04-19 18:55:14.513 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 9/600) 2012-04-19 18:55:15.944 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 10/600) 2012-04-19 18:55:17.230 OpenCVClient[77273:13b07] actual time: 11/600 (requested: 11/600) 2012-04-19 18:55:17.995 OpenCVClient[77273:13b07] actual time: 11/600 (requested: 12/600) 2012-04-19 18:55:18.716 OpenCVClient[77273:13b07] actual time: 11/600 (requested: 13/600) 2012-04-19 18:55:19.399 OpenCVClient[77273:13b07] actual time: 11/600 (requested: 14/600) 

正如您在代码中看到的那样,我试图设置AVURLAssetPreferPreciseDurationAndTimingKeyrequestedTimeToleranceBeforerequestedTimeToleranceAfter无效。

有任何想法吗?

使用您的代码,您可以获得所有电影框架。 请求时间和实际时间之间的差异是由电影帧速率引起的。 看来,你的电影大约有。 25-29 fps。 因此,例如,在1 / 600s和8 / 600s之间没有差异帧。

  //loading image NSString *initialURL = [NSString stringWithFormat:@"%@",[arrayURL objectAtIndex:indexPath.row]]; NSURL *url=[NSURL fileURLWithPath:initialURL]; NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; self.asset=[[AVURLAsset alloc] initWithURL:url options:options]; NSMutableArray *thumbTimes=[NSMutableArray arrayWithCapacity:asset.duration.value]; CMTime thumbTime = CMTimeMake(1,1); NSValue *v=[NSValue valueWithCMTime:thumbTime]; [thumbTimes addObject:v]; self.imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; self.imageGenerator.appliesPreferredTrackTransform=TRUE; self.imageGenerator.requestedTimeToleranceAfter=kCMTimeZero; self.imageGenerator.requestedTimeToleranceBefore=kCMTimeZero; AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ if (result != AVAssetImageGeneratorSucceeded) { NSLog(@"couldn't generate thumbnail, error:%@", error); } NSLog(@"actual time: %lld/%d (requested: %lld/%d)",actualTime.value,actualTime.timescale,requestedTime.value,requestedTime.timescale); //your image view imageView.image = [UIImage imageWithCGImage:im]; }; CGSize maxSize = CGSizeMake(320, 180); imageGenerator.maximumSize = maxSize; [imageGenerator generateCGImagesAsynchronouslyForTimes:thumbTimes completionHandler:handler]; //loaging complete