Получение миниатюры из url-адреса видео или данных в iPhone SDK
Я пытаюсь получить миниатюру (первого кадра) из видео, снятого с камеры iphone 3GS, чтобы я мог ее отобразить. Кто-нибудь преуспел в этом? Если да, то как это сделать?
10 ответов:
ответ на этот вопрос заключается в том, что теперь с 4.0 iOS можно получить миниатюры с помощью AVFoundation, следующий код, где url-адрес свойства класса является url-адресом фильма, будет делать трюк (вы можете получить миниатюру в любое время, в примере его в момент времени 0)
-(void)generateImage { AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:self.url options:nil]; AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; generator.appliesPreferredTrackTransform=TRUE; [asset release]; CMTime thumbTime = CMTimeMakeWithSeconds(0,30); AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ if (result != AVAssetImageGeneratorSucceeded) { NSLog(@"couldn't generate thumbnail, error:%@", error); } [button setImage:[UIImage imageWithCGImage:im] forState:UIControlStateNormal]; thumbImg=[[UIImage imageWithCGImage:im] retain]; [generator release]; }; CGSize maxSize = CGSizeMake(320, 180); generator.maximumSize = maxSize; [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler]; }
-(UIImage *)generateThumbImage : (NSString *)filepath { NSURL *url = [NSURL fileURLWithPath:filepath]; AVAsset *asset = [AVAsset assetWithURL:url]; AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; imageGenerator.appliesPreferredTrackTransform = YES; CMTime time = [asset duration]; time.value = 0; CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]; UIImage *thumbnail = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); // CGImageRef won't be released by ARC return thumbnail; }
вы можете получить кадр, используя время.значение предположим, что вы хотите, чтобы 1 второй кадр затем использовать
time.value = 1000 //Time in milliseconds
NSURL *videoURL = [NSURL fileURLWithPath:url]; MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL]; UIImage *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame]; //Player autoplays audio on init [player stop]; [player release];
проверьте эту ссылку для альтернативы: thumbnailImageAtTime: теперь устарели - какова альтернатива?
SWIFT 2.0
вы можете генерировать в swift двумя способами 1. AVFoundation 2. MPMoviePlayerController
1. func generateThumnail(url : NSURL) -> UIImage{ var asset : AVAsset = AVAsset.assetWithURL(url) as AVAsset var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) assetImgGenerate.appliesPreferredTrackTransform = true var error : NSError? = nil var time : CMTime = CMTimeMake(1, 30) var img : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error) var frameImg : UIImage = UIImage(CGImage: img)! return frameImg } 2. override func viewDidLoad() { super.viewDidLoad() var moviePlayer : MPMoviePlayerController! = MPMoviePlayerController(contentURL: moviePlayManager.movieURL) moviePlayer.view.frame = CGRect(x: self.view.frame.origin.x, y: self.view.frame.origin.y, width: self.view.frame.size.width, height: self.view.frame.height) moviePlayer.fullscreen = true moviePlayer.controlStyle = MPMovieControlStyle.None NSNotificationCenter.defaultCenter().addObserver(self, selector: "videoThumbnailIsAvailable:", name: MPMoviePlayerThumbnailImageRequestDidFinishNotification, object: nil) let thumbnailTimes = 3.0 moviePlayer.requestThumbnailImagesAtTimes([thumbnailTimes], timeOption: .NearestKeyFrame) } func videoThumbnailIsAvailable(notification: NSNotification){ if let player = moviePlayer{ let thumbnail = notification.userInfo![MPMoviePlayerThumbnailImageKey] as? UIImage if let image = thumbnail{ /* We got the thumbnail image. You can now use it here */ println("Thumbnail image = \(image)") } }
Swift 2 код:
func previewImageForLocalVideo(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 } }
Для Swift 3.0
func createThumbnailOfVideoFromFileURL(_ strVideoURL: String) -> UIImage?{ let asset = AVAsset(url: URL(string: strVideoURL)!) 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 { /* error handling here */ } return nil }
может быть, это полезно для кого-то, кто сталкивается с той же проблемой. Мне нужно было простое решение для создания миниатюр для изображений, PDF-файлов и видео. Чтобы решить эту проблему, я создал следующую библиотеку.
https://github.com/prine/ROThumbnailGenerator
использование очень просто:
var thumbnailImage = ROThumbnail.getThumbnail(url)
Он имеет внутри три различных реализаций и в зависимости от расширения файла он создает эскиз. Вы можете легко добавить свою собственную реализацию, если вам нужен создатель миниатюр для другого расширения файла.
Swift 2.1 получение миниатюр с требуемыми интервалами времени
func getPreviewImageForVideoAtURL(videoURL: NSURL, atInterval: Int) -> UIImage? { print("Taking pic at \(atInterval) second") let asset = AVAsset(URL: videoURL) let assetImgGenerate = AVAssetImageGenerator(asset: asset) assetImgGenerate.appliesPreferredTrackTransform = true let time = CMTimeMakeWithSeconds(Float64(atInterval), 100) do { let img = try assetImgGenerate.copyCGImageAtTime(time, actualTime: nil) let frameImg = UIImage(CGImage: img) return frameImg } catch { /* error handling here */ } return nil }
вы получите миниатюру изображения из URL при изменении "fileURLWithPath"на " URLWithString".
в моем случае это сработало, как это.
NSURL *url = [NSURL URLWithString:filepath]; AVAsset *asset = [AVAsset assetWithURL:url]; AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; CMTime time = [asset duration]; time.value = 0; CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]; UIImage *thumbnail = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); return thumbnail;