Cannot be AVAssetImageGenerator give me all the frames of the movie

I can not AVAssetImageGeneratorprovide me all the frames of the film.

Using this code:

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

I get:

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)

As you can see in the code, I tried to install AVURLAssetPreferPreciseDurationAndTimingKey, requestedTimeToleranceBeforeand requestedTimeToleranceAfterwithout effect.

Any ideas?

+3
source share
2 answers

With your code, you get the entire frame of the movie. The difference between the requested and the actual time is due to the frame rate. Your movie seems to be ok. 25-29 frames per second. So, for example, there is no difference between the time 1/600 and 8/600.

+1
source
    //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
-1
source

All Articles