2011-04-19 17 views
21

Estoy tratando de obtener la miniatura del video que se recoge de la biblioteca usando el UIImagePickerController.UIImagePickerController miniatura del video que se recupera de la biblioteca

Aquí está mi código. Puedo obtener la miniatura del video si uso la cámara para grabar un video. Pero no puedo obtener la miniatura si recojo un video de la biblioteca. ¿Alguien sabe por qué?

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 

    if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) 
    { 
     NSURL *mediaUrl = [info objectForKey:UIImagePickerControllerMediaURL]; 

     MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mediaUrl]; 
     moviePlayer.shouldAutoplay = NO; 
     UIImage *thumbnail = [[moviePlayer thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame] retain]; 
     [imageView setImage:thumbnail]; //imageView is a UIImageView 

     [moviePlayer release]; 
     [thumbnail release]; 
     [self dismissModalViewControllerAnimated:YES]; 
    } 
} 
+0

alguien me puede ayudar? – Gargamal

Respuesta

40

Tuve un problema semi relacionado y finalmente abandoné el uso de MPMoviePlayer para generar miniaturas. Intenta usar AVAssetImageGenerator en su lugar. Apple discute el uso de AVAssetImageGenerator para crear miniaturas here. Aquí está mi propio código de muestra, que toma una única imagen en miniatura. Deberá incluir el marco AVFoundation.

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidPath options:nil]; 
AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
gen.appliesPreferredTrackTransform = YES; 
CMTime time = CMTimeMakeWithSeconds(0.0, 600); 
NSError *error = nil; 
CMTime actualTime; 

CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error]; 
UIImage *thumb = [[UIImage alloc] initWithCGImage:image]; 
CGImageRelease(image); 
[gen release]; 
+10

también agregue el marco CoreMedia – ArunGJ

14

El marco AssetsLibrary tiene exactamente lo que necesita con las clases ALAssetsLibrary y ALAsset. Este código funciona tanto para fotos como para videos y la imagen en miniatura es exactamente la misma que se ve en el selector.

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    [[ALAssetsLibrary new] assetForURL:info[UIImagePickerControllerReferenceURL] resultBlock:^(ALAsset *asset) { 
     imageView.image = [UIImage imageWithCGImage:asset.thumbnail]; 
    } failureBlock:^(NSError *error) { 
     // handle error 
    }]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Tenga en cuenta que hay un fallo en iOS 8 con álbumes de fotos Stream, ver ALAssetsLibrary assetForURL: always returning nil for photos in “My Photo Stream” in iOS 8.1 para una solución.

+0

En iOS 8 y posterior, Apple recomienda usar el [Marco de Fotos] (https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/Photos_Framework/index.html# // apple_ref/doc/uid/TP40014408) en lugar de ALAssetsLibrary. Este sería un mejor enfoque que recurrir a 'enumerateGroupsWithTypes: usingBlock:'. –

+0

Creo que el comentario pertenece más bien a la pregunta vinculada. – 0xced

+0

Necesito hacer lo mismo en Swift3 ... –

0

Swift 3.1

Tengo crear una función de clase y pasar su URL en el parámetro

class func captureThumbnail(withVideoURL videoURL:URL,secs:Int,preferredTimeScale scale:Int,completionHandler:((UIImage?) ->Void)?) -> Void 
{ 
    //let seconds : Int64 = 10 
    // let preferredTimeScale : Int32 = 1 

    DispatchQueue.global().async { 

     do 
     { 
      let asset = AVURLAsset(url: videoURL) 

      let imgGenerator = AVAssetImageGenerator(asset: asset) 
      imgGenerator.appliesPreferredTrackTransform = true 
      let cgImage = try imgGenerator.copyCGImage(at:CMTimeMake(Int64(secs), Int32(scale)),actualTime: nil) 
      let thumbnail = UIImage(cgImage: cgImage) 
      completionHandler?(thumbnail) 
     } 
     catch let error as NSError 
     { 
      print("Error generating thumbnail: \(error)") 
      completionHandler?(nil) 
     } 
    } 
} 
Cuestiones relacionadas