2012-05-08 49 views
5

ai cũng có thể cho tôi biết cách trích xuất hình ảnh từ video? những gì tôi đã cố gắng cho đến bây giờ là tôi đã làm theo các:Làm cách nào để trích xuất hình ảnh từ video?

vv và sau đó tôi đã làm điều này:

Mã nguồn:

- (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 ... 
} 

Sau khi thực hiện tất cả điều này tôi vẫn dint đạt nơi mà tôi muốn reach.i dint có được hình ảnh still.I'm mắc kẹt now.Pls ai giúp tôi ra !!! Cảm ơn :)

Trả lời

12

Cách đơn giản để trích xuất hình thu nhỏ từ phim là sử dụng lớp MPMoviePlayerController và phương thức - thumbnailImageAtTime:timeOption: của nó.

Ví dụ bạn đã có một url filepath:

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

tôi đã sử dụng nó trong mã của tôi và nó làm việc.

+0

Bạn có thể cho tôi biết cách tôi có thể nhận đường dẫn và tiện ích mở rộng của hình thu nhỏ này không ?? –

+1

Theo ví dụ của tôi, bạn sẽ nhận được đối tượng UIImage. Sau đó, bạn có thể lưu nó dưới dạng png hoặc jpg. –

+0

ok thanks buddy :) –

4

hình thu nhỏImageAtTime: timeOption bị xóa khỏi iOS 7.0. Dưới đây là một cách thay thế

+ (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

Chúng ta có thể viết lại điều này để xem toàn bộ video không? Hoặc có lẽ cứ sau 1 giây. – benjaminhallock

Các vấn đề liên quan