2012-05-08 22 views
5

Czy ktoś może mi powiedzieć, jak wyodrębnić obrazy z wideo? co ja już próbowałem do tej pory ja ve śledzić te:Jak wyodrębnić obrazy z wideo?

itd., a potem ja robiłem tak:

Kod źródłowy:

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

Po zrobieniu tego wszystkiego i nadal odczuwało osiągnął gdzie chcę reach.i odczuwało się wizerunki still.I'm zatrzymany now.Pls ktoś mi pomóc !!! Dzięki :)

Odpowiedz

12

Prostym sposobem wyodrębnienia miniatur z filmu jest użycie klasy MPMoviePlayerController i jej metody - thumbnailImageAtTime:timeOption:.

Na przykład masz url filePath:

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

użyłem go w kodzie i to działało.

+0

Czy możesz mi powiedzieć, w jaki sposób mogę uzyskać ścieżkę i rozszerzenie tej miniatury ?? –

+1

Według mojego przykładu otrzymasz obiekt UIImage. Następnie możesz zapisać go jako png lub jpg. –

+0

ok dzięki kolego :) –

4

thumbnailImageAtTime: timeOption jest zdeplikowany od iOS 7.0. Oto alternatywa:

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

Czy możemy przepisać to, aby przejść przez cały film? A może co 1 sekundę. – benjaminhallock

Powiązane problemy