videos snaptube para guardar convertir convertidor como amerigo iphone video thumbnails

iphone - snaptube - workflow youtube



Obtener una miniatura de una url de video o datos en el SDK de iPhone (10)

Estoy tratando de obtener una miniatura (del primer fotograma) de un video tomado de la cámara del iPhone 3GS para poder mostrarlo. ¿Alguien ha tenido éxito en hacer esto? Si es así, ¿cómo hacerlo?


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


SWIFT 2.0

Puede generar de manera rápida de dos maneras 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)") } }


Código de 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 } }


El mejor método que he encontrado ... MPMoviePlayerController thumbnailImageAtTime:timeOption


La respuesta a esta pregunta es que ahora con 4.0 iOS puede obtener miniaturas utilizando AVFoundation, el siguiente código donde la URL de la propiedad de la clase es la url de la película, hará el truco (puede obtener la miniatura en cualquier momento, en el ejemplo es tiempo 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]; }


Obtendrá Imagen en miniatura de URL cuando cambie "fileURLWithPath" a "URLWithString".

En mi caso, funcionó así.

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;


Tal vez esto sea útil para alguien más que enfrenta el mismo problema. Necesitaba una solución fácil para crear una miniatura para imágenes, archivos PDF y videos. Para resolver ese problema, he creado la siguiente Biblioteca.

https://github.com/prine/ROThumbnailGenerator

El uso es muy sencillo: var thumbnailImage = ROThumbnail.getThumbnail(url)

Tiene internamente tres implementaciones diferentes y, dependiendo de la extensión del archivo, crea la miniatura. Puede agregar fácilmente su propia implementación si necesita un creador de miniaturas para otra extensión de archivo.


Swift 2.1 Obtener miniaturas a intervalos de tiempo requeridos

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 }


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

puede obtener el marco utilizando el valor de tiempo. Suponga que desea 1 segundo marco y luego use el

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

Consulte este enlace para obtener una alternativa: thumbnailImageAtTime: ahora obsoleto: ¿cuál es la alternativa?