在iPhone SDK中从videourl创build缩略图

我正在尝试从videourl获取缩略图。 video是m3u8格式的stream(HLS)。 我已经尝试从MPMoviePlayerController requestThumbnailImagesAtTimes,但没有奏效。 有没有人有这个问题的解决scheme? 如果是这样,你怎么做?

如果你不想使用MPMoviePlayerController ,你可以这样做:

  AVAsset *asset = [AVAsset assetWithURL:sourceURL]; AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; CMTime time = CMTimeMake(1, 1); CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]; UIImage *thumbnail = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); // CGImageRef won't be released by ARC 

这是Swift中的一个例子:

 func thumbnail(sourceURL sourceURL:NSURL) -> UIImage { let asset = AVAsset(URL: sourceURL) let imageGenerator = AVAssetImageGenerator(asset: asset) let time = CMTime(seconds: 1, preferredTimescale: 1) do { let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil) return UIImage(CGImage: imageRef) } catch { print(error) return UIImage(named: "some generic thumbnail")! } } 

我更喜欢通过AVAssetImageGenerator使用AVAssetImageGenerator ,因为它是线程安全的,并且可以一次有多个实例化。

从videourl获取缩略图。

  NSString *strVideoURL = @"http://www.xyzvideourl.com/samplevideourl"; NSURL *videoURL = [NSURL URLWithString:strVideoURL] ; MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease]; UIImage *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame]; player = nil; 

strVideoURLreplace您的videourlstring。 您将获得缩略图作为video输出。 而缩略图是UIImagetypes的数据!

 -(UIImage *)loadThumbNail:(NSURL *)urlVideo { AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:urlVideo options:nil]; AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset]; generate.appliesPreferredTrackTransform=TRUE; NSError *err = NULL; CMTime time = CMTimeMake(1, 60); CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err]; NSLog(@"err==%@, imageRef==%@", err, imgRef); return [[UIImage alloc] initWithCGImage:imgRef]; } 

在你的项目中添加AVFoundation框架,不要忘记导入<AVFoundation/AVFoundation.h> ,你必须将保存在文档目录中的videopath作为parameter passing给UIImage

您可以使用以下代码从videourl获取缩略图

 MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease]; UIImage *thumbnail = [player thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame]; 

也许这对面临同样问题的其他人有用。 我需要一个简单的解决scheme来创build图片,PDF和video的缩略图。 为了解决这个问题,我创build了下面的库(在Swift中)。

https://github.com/prine/ROThumbnailGenerator

用法非常简单:var thumbnailImage = ROThumbnail.getThumbnail(url)

它在内部有三个不同的实现,并根据文件扩展名创build缩略图。 如果你需要一个缩略图创build器来创build另一个文件扩展名,你可以轻松地添加你自己的实现。

Swift 3版本:

 func createThumbnailOfVideoFromFileURL(videoURL: String) -> UIImage? { let asset = AVAsset(url: URL(string: videoURL)!) let assetImgGenerate = AVAssetImageGenerator(asset: asset) assetImgGenerate.appliesPreferredTrackTransform = true let time = CMTimeMakeWithSeconds(Float64(1), 100) do { let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil) let thumbnail = UIImage(cgImage: img) return thumbnail } catch { // Set a default image if Image is not acquired return UIImage(named: "ico_placeholder") } } 

对于Swift 3.0:

  func generateThumbnailForVideoAtURL(filePathLocal: NSString) -> UIImage? { let vidURL = NSURL(fileURLWithPath:filePathLocal as String) let asset = AVURLAsset(url: vidURL as URL) let generator = AVAssetImageGenerator(asset: asset) generator.appliesPreferredTrackTransform = true let timestamp = CMTime(seconds: 1, preferredTimescale: 60) do { let imageRef = try generator.copyCGImage(at: timestamp, actualTime: nil) let frameImg : UIImage = UIImage(cgImage: imageRef) return frameImg } catch let error as NSError { print("Image generation failed with error ::\(error)") return nil } } 

Swift 2代码与AVAssetImageGenerator:

 func thumbnailImageForVideo(url:NSURL) -> UIImage? { let asset = AVAsset(URL: url) let imageGenerator = AVAssetImageGenerator(asset: asset) imageGenerator.appliesPreferredTrackTransform = true var time = asset.duration //If possible - take not the first frame (it could be completely black or white on camara's videos) time.value = min(time.value, 2) do { let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil) return UIImage(CGImage: imageRef) } catch let error as NSError { print("Image generation failed with error \(error)") return nil } }