2

I'm trying to display a movie thumbnail in an button for user to see before they upload it. I'm using AVAssetImageGenerator. Here the code:

AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:[NSURL URLWithString:moviePath] options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform=TRUE;
CMTime thumbTime = CMTimeMakeWithSeconds(0,30);

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

    switch (result) {
        case AVAssetImageGeneratorSucceeded:
            NSLog(@"Image generator succeeded!");
            [imageButton setImage:[UIImage imageWithCGImage:im] forState:UIControlStateNormal];
            break;

        case AVAssetImageGeneratorCancelled:
            NSLog(@"Image generator cancelled!");
            NSLog(@"couldn't generate thumbnail, error:%@", error);
            [imageButton setTitle:@"Video attached" forState:UIControlStateNormal];
            break;

        case AVAssetImageGeneratorFailed:
            NSLog(@"Image generator failed!");
            NSLog(@"couldn't generate thumbnail, error:%@", error);
            [imageButton setTitle:@"Video attached" forState:UIControlStateNormal];
            break;

        default:
            break;
    }
};

CGSize maxSize = CGSizeMake(320, 180);
generator.maximumSize = maxSize;
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

The above code fails with this error:

couldn't generate thumbnail, error:Error Domain=NSURLErrorDomain Code=-1 "unknown error" UserInfo=0x1f90a080 {NSUnderlyingError=0x1f979aa0 "The operation couldn’t be completed. (OSStatus error -12935.)", NSLocalizedDescription=unknown error}

the moviePath variable from imagePickeController is: /private/var/mobile/Applications/89FD1D5F-B49C-4E6B-B1AA-7F1CF1F3FE83/tmp//trim.eaEKqI.MOV

Kwame
  • 1,115
  • 2
  • 21
  • 38

2 Answers2

1

Make sure you are using [NSURL fileURLWithPath:@"yourpath"] and NOT [NSURL URLWithString:] when you generate your URL

Arie Litovsky
  • 4,893
  • 2
  • 35
  • 40
0

This is an old link but if someone is still looking for an answer, the important thing to note is that you should only generate the image after the Asset has become playable.

Here's some code that might get the concept across:

AVAsset *asset = [AVURLAsset URLAssetWithURL:url                                                    options:@{
                                                              AVURLAssetReferenceRestrictionsKey: @(AVAssetReferenceRestrictionForbidNone),
                                                       AVURLAssetHTTPCookiesKey: cookies,
                                                         AVURLAssetAllowsCellularAccessKey: @false
                                                       }];
        NSArray *requestedKeys = [NSArray arrayWithObjects:
                                  @"playable", nil];
        [asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler: ^{
                AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
                [imageGenerator setRequestedTimeToleranceBefore:kCMTimePositiveInfinity];
                [imageGenerator setRequestedTimeToleranceAfter:kCMTimePositiveInfinity];
                imageGenerator.appliesPreferredTrackTransform = YES;
                CMTime thumbTime = CMTimeMakeWithSeconds(0,1);

                NSError *error = NULL;
                CGImageRef imageRef = [imageGenerator copyCGImageAtTime:thumbTime actualTime:NULL error:&error];
                UIImage *img = [UIImage imageWithCGImage:imageRef];
                if (img) {

                    NSLog(@"Loaded image from %@", [url absoluteString]);
                }
                else {
                    NSLog(@"Could not load image from %@, error:%@", [url absoluteString], error);
                }
                //have to manually release because ARC does not release imageref
                CGImageRelease(imageRef);
             }];
    }
Alok
  • 1
  • 1