Objective-C: Getting PNG Thumbnail from Movie with NSData

I have the following code to attempt to get a screenshot of a video file from NSData. I can confirm the NSData is valid and not nil, however both dataString and movieURL are returning nil.

- (UIImage *)imageFromMovie:(NSData *)movieData {

    // set up the movie player
    NSString *dataString = [[NSString alloc] initWithData:movieData encoding:NSUTF8StringEncoding];
    NSURL *movieURL = [NSURL URLWithString:dataString];

    // get the thumbnail
    AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:movieURL options:nil];
    AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
    generate1.appliesPreferredTrackTransform = YES;
    NSError *err = NULL;
    CMTime time = CMTimeMake(1, 2);
    CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
    UIImage *one = [[UIImage alloc] initWithCGImage:oneRef];

    return(one);

}

EDIT: Here’s a look at where/how I’m getting the NSData from the UIImagePicker

  • UICollectionView Cell Spacing based on device screen size
  • Self Sizing Cells make UITableView jump
  • Subview appears underneath superviews layer.border?
  • How can we implement concurrency thread using protocol in swift?
  • “Stream is sending an event before being opened”
  • Under iOS 7, how do I hide and show status bar on the fly (whenever I want to)
  • if ([mediaType isEqualToString:@"ALAssetTypeVideo"]) {
    
        ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
        [assetLibrary assetForURL:[[info objectAtIndex:x] valueForKey:UIImagePickerControllerReferenceURL] resultBlock:^(ALAsset *asset) {
    
        ALAssetRepresentation *rep = [asset defaultRepresentation];
    
            unsigned long DataSize = (unsigned long)[rep size];
        Byte *buffer = (Byte*)malloc(DataSize);
            NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:DataSize error:nil];
    
        //here’s the NSData
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
    
    
    
        } failureBlock:^(NSError *err) {
                 NSLog(@"Error: %@",[err localizedDescription]);
            }];
    }
    

    3 Solutions Collect From Internet About “Objective-C: Getting PNG Thumbnail from Movie with NSData”

    Possible, you have problems with encoding.

    NSString instance method -(id)initWithData:data:encoding returns nil if data does not represent valid data for encoding.(https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/#//apple_ref/occ/instm/NSString/initWithData:encoding🙂

    Try to use correct encoding in -(id)initWithData:data:encoding method.

    You are trying to convert the movie data to NSURL, that’s why you are getting a nil url.

    In your implementation, you can get the thumbnail in the following way:

    AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:[[info objectAtIndex:x] valueForKey:UIImagePickerControllerReferenceURL] options:nil];
    AVAssetImageGenerator *generate1          = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
    generate1.appliesPreferredTrackTransform = YES;
    NSError *err                             = NULL;
    CMTime time                              = CMTimeMake(1, 2);
    CGImageRef oneRef                        = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
    UIImage *one                             = [[UIImage alloc] initWithCGImage:oneRef];
    

    Download my sample project before reading this answer from:

    https://drive.google.com/open?id=0B_exgT43OZJOWl9HMDJCR0cyTW8

    I know it’s been a really long time since you posted this question; but, I found it, can answer it, and am reasonably confident that, unless you used the sample code provided by the Apple Developer Connection web site that does what you’re asking, you still need answer. I base that solely on this fact: it’s hard to figure out.

    Nonetheless, I have a basic, working project that addresses your question; however, before looking at it, check out a video I made of it running on my iPhone 6s Plus:

    <iframe width="640" height="360" src="https://www.youtube.com/embed/GiF-FFKvy5M?rel=0&amp;controls=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>