2011-04-19 145 views
21

我想要使用UIImagePickerController從視頻庫中選取視頻的縮略圖。UIImagePickerController從視頻庫中選取的視頻縮略圖

這是我的代碼。如果我使用相機錄製視頻,我可以獲得視頻的縮略圖。但是如果我從圖書館拿起視頻,我無法得到縮略圖。任何人都知道爲什麼?

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

任何人都可以幫助我嗎? – Gargamal 2011-05-06 16:31:08

回答

40

我有一個半相關的問題,並最終放棄使用MPMoviePlayer生成縮略圖。請嘗試使用AVAssetImageGenerator。 Apple討論了使用AVAssetImageGenerator創建縮略圖here。這是我自己的示例代碼,它捕獲單個縮略圖圖像。您將需要包含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

也添加框架CoreMedia – ArunGJ 2011-08-22 07:00:40

14

AssetsLibrary框架有正是你需要與ALAssetsLibraryALAsset類的東西。此代碼適用於照片和視頻,縮略圖圖像與您在選取器中看到的完全相同。

- (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]; 
} 

注意,有一個與照片流專輯在iOS 8中的錯誤,請參閱ALAssetsLibrary assetForURL: always returning nil for photos in 「My Photo Stream」 in iOS 8.1的解決方法。

+0

在iOS 8和更高版本中,Apple建議使用[Photos framework](https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/Photos_Framework/index.html# // apple_ref/doc/uid/TP40014408)而不是ALAssetsLibrary。這會比退回到'enumerateGroupsWithTypes:usingBlock:'更好。 – 2015-02-03 14:17:44

+0

我認爲這個評論更屬於相關的問題。 – 0xced 2015-02-03 15:22:48

+0

我需要在Swift3中做同樣的事情... – 2017-02-20 14:38:05

0

雨燕3.1

我創建一個類的功能,並通過您的網址在參數

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) 
     } 
    } 
}