2012-05-08 10 views
5

¿alguien me puede decir cómo extraer imágenes de un video? lo que he probado hasta ahora es que me ve Siga estas:¿Cómo extraer imágenes de un video?

etc y después de que yo he hecho esto:

Código Fuente:

- (void)viewDidLoad 
{ 
    videoPicker = [[UIImagePickerController alloc] init]; 
    [videoPicker setDelegate:self]; 
    videoPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    NSArray *mediaTypesAllowed = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; 
    videoPicker.mediaTypes = mediaTypesAllowed; 
    videoPicker.view.hidden = YES; 
} 


-(IBAction)imgPickerController 
{ 
    [self presentModalViewController:videoPicker animated:YES]; 
    videoPicker.view.hidden = NO; 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    // e.g. 
    NSString *tempFilePath = [(NSURL *)[info valueForKey:UIImagePickerControllerMediaURL] absoluteString]; 

    NSLog(@"didFinishPickingMediaWithInfo: %@",tempFilePath); 

    // e.g. /private/var/mobile/Applications/D1E784A4-EC1A-402B-81BF-F36D3A08A332/tmp/capture/capturedvideo.MOV 
    tempFilePath = [tempFilePath substringFromIndex:16]; 

    NSLog(@"didFinishPickingMediaWithInfo: %@",tempFilePath); 
    NSLog(@"===Try to save video to camera roll.==="); 
    NSLog(@"UIVideoAtPathIsCompatibleWithSavedPhotosAlbum: %@",UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(tempFilePath)? @"YES":@"NO"); 

    // Check if the video file can be saved to camera roll. 
    if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(tempFilePath)) 
    { 
     // YES. Copy it to the camera roll. 
     UISaveVideoAtPathToSavedPhotosAlbum(tempFilePath, self, @selector(video:didFinishSavingWithError:contextInfo:),(__bridge_retained void *)tempFilePath); 
    } 

    [self dismissModalViewControllerAnimated:YES]; 
} 

- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(NSString *)contextInfo 
{ 
    NSLog(@"didFinishSavingWithError--videoPath in camera roll:%@",videoPath); 
    NSLog(@"didFinishSavingWithError--videoPath in temp directory:%@",contextInfo); 

    // The thumbnail jpg should located in this directory. 
    NSString *thumbnailDirectory = [[contextInfo stringByDeletingLastPathComponent] stringByDeletingLastPathComponent]; 

    // Debug info. list all files in the directory of the video file. 
    // e.g. /private/var/mobile/Applications/D1E784A4-EC1A-402B-81BF-F36D3A08A332/tmp/capture 
    NSLog(@"%@",[contextInfo stringByDeletingLastPathComponent]); 
    NSLog(@"%@",[[[NSFileManager defaultManager] contentsOfDirectoryAtPath:[contextInfo stringByDeletingLastPathComponent] error:nil] description]); 

    // Debug info. list all files in the parent directory of the video file, i.e. the "~/tmp" directory. 
    // e.g. /private/var/mobile/Applications/D1E784A4-EC1A-402B-81BF-F36D3A08A332/tmp 
    NSLog(@"%@",thumbnailDirectory); 
    NSLog(@"%@",[[[NSFileManager defaultManager] contentsOfDirectoryAtPath:thumbnailDirectory error:nil] description]); 
    /////////////////// 

    // Find the thumbnail for the video just recorded. 
    NSString *file,*latestFile; 

    NSDate *latestDate = [NSDate distantPast]; 
    NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:[[contextInfo stringByDeletingLastPathComponent]stringByDeletingLastPathComponent]]; 

    // Enumerate all files in the ~/tmp directory 
    while (file = [dirEnum nextObject]) 
    { 
     // Only check files with jpg extension. 
     if ([[file pathExtension] isEqualToString: @"jpg"]) 
     { 
      NSLog(@"***latestDate:%@",latestDate); 
      NSLog(@"***file name:%@",file); 
      NSLog(@"***NSFileSize:%@", [[dirEnum fileAttributes] valueForKey:@"NSFileSize"]); 
      NSLog(@"***NSFileModificationDate:%@", [[dirEnum fileAttributes] valueForKey:@"NSFileModificationDate"]); 

      // Check if current jpg file is the latest one. 
      if ([(NSDate *)[[dirEnum fileAttributes] valueForKey:@"NSFileModificationDate"] compare:latestDate] == NSOrderedDescending) 
      { 
       latestDate = [[dirEnum fileAttributes] valueForKey:@"NSFileModificationDate"]; 
       latestFile = file; 
       NSLog(@"***latestFile changed:%@",latestFile); 
      } 
     } 
    } 

    // The thumbnail path. 
    latestFile = [NSTemporaryDirectory() stringByAppendingPathComponent:latestFile]; 
    NSLog(@"****** The thumbnail file should be this one:%@",latestFile); 

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:latestFile]; 
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(150, 150, 100, 100)]; 
    [imgView setImage:img]; 
    imgView.layer.borderWidth = 2.0; 
    [self.view addSubview:imgView]; 

    // Your code ... 
    // Your code ... 
    // Your code ... 
} 

Después de hacer todo esto todavía alcancé a fuerza i donde quiero reach.i fuerza obtener imágenes still.I'm pegado now.Pls alguien ayudarme !!! Gracias :)

Respuesta

12

La forma simple de extraer miniaturas de una película es usar la clase MPMoviePlayerController y su método - thumbnailImageAtTime:timeOption:.

Por ejemplo usted tiene una ruta de archivo url:

NSURL *tempFilePathURL = ...; 
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL: tempFilePathURL]; 
UIImage *thumbnail = [player thumbnailImageAtTime:THUMBNAIL_TIME timeOption:MPMovieTimeOptionExact]; 
[player release]; 

lo usé en mi código y funcionó.

+0

Can u pls dime cómo puedo obtener la ruta y la extensión de esta miniatura ?? –

+1

Según mi ejemplo, obtendrás un objeto UIImage. Entonces puedes guardarlo como png o jpg. –

+0

ok gracias amigo :) –

4

thumbnailImageAtTime: timeOption está privado de iOS 7.0. Aquí es una alternativa

+ (UIImage *)extractFirstFrameFromFilepath:(NSString *)filepath 
{ 
    AVURLAsset *movieAsset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:filepath] options:nil]; 
    AVAssetImageGenerator *assetImageGemerator = [[AVAssetImageGenerator alloc] initWithAsset:movieAsset]; 
    assetImageGemerator.appliesPreferredTrackTransform = YES; 
    CGImageRef frameRef = [assetImageGemerator copyCGImageAtTime:CMTimeMake(1, 2) actualTime:nil error:nil]; 
    return [[UIImage alloc] initWithCGImage:frameRef]; 
} 
+1

¿Podemos reescribir esto para revisar todo el video? O tal vez cada 1 segundo. – benjaminhallock

Cuestiones relacionadas