2012-01-18 16 views
14

Estoy seleccionando un videoclip de la biblioteca. Y quiero crear una imagen en miniatura de él. He aplicado este código. Pero la imagen apareció rotada. Quiero su vista original.Imagen en miniatura del video

- (UIImage*)testGenerateThumbNailDataWithVideo { 

    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:appDelegate.videoURL options:nil]; 
    AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    NSError *err = NULL; 
    CMTime time = CMTimeMake(1, 60); 
    CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err]; 
    [generate release]; 
    NSLog(@"err==%@, imageRef==%@", err, imgRef); 
    UIImage *currentImg = [[[UIImage alloc] initWithCGImage:imgRef] autorelease]; 
    static BOOL flag = YES; 
    if (flag) { 
     NSData *tmpData = UIImageJPEGRepresentation(currentImg, 0.8); 
     NSString *path = [NSString stringWithFormat:@"%@thumbNail.png", NSTemporaryDirectory()]; 
     BOOL ret = [tmpData writeToFile:path atomically:YES]; 
     NSLog(@"write to path=%@, flag=%d", path, ret); 
     flag = NO; 
    } 
    return currentImg; 
} 
+0

posible duplicado de [miniatura Obtención de una URL de vídeo o datos en iPhone SDK] (http://stackoverflow.com/questions/1347562/getting-thumbnail-from- a-video-url-o-data-in-iphone-sdk) – Avt

Respuesta

37

Pruebe usar AVAssetImageGenerator en su lugar. Apple discute el uso de AVAssetImageGenerator para crear miniaturas here. Aquí hay un código de muestra, que toma una sola imagen en miniatura. Deberá incluir el marco AVFoundation. Y también añadir marco CoreMedia

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

Una solución es más

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

} 

O

ALAsset
display image from URL retrieved from ALAsset in iPhone

+0

Solo una pista. Necesitaba ser muy preciso sobre el momento de obtener la imagen. Puede establecer requiredTimeToleranceAfter y requestedTimeToleranceBefore igual a kCMTimeZero. – SlowTree

+0

Hola, amigo, esto es genial, el código es obtener la imagen, pero lo que intento hacer es obtener la imagen del video 10 veces por segundo, y he estado jugando con la variable de tiempo y los bucles pero no puedo obtener para que funcione? Tengo toda la pregunta aquí con una recompensa si no te importa echar un vistazo. Muchas gracias http://stackoverflow.com/questions/29425455/ios-take-multiple-screen-shots – iqueqiorio

+0

gen.appliesPreferredTrackTransform = YES; trabajó para mi. Si no uso esto, las imágenes salieron giradas. – Nil

2

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 
    } 
} 
+0

¿estás seguro de que time.value es el número de cuadro y no los segundos? – Sam

+0

@Sam Sí, lo soy. Verifique https://developer.apple.com/library/mac/documentation/CoreMedia/Reference/CMTime/index.html#//apple_ref/swift/struct/c:@[email protected] 'value/timescale = seconds'. – Avt

+0

Una forma mejor de obtener tiempo sería usar las funciones para manipular CMTime que se describen aquí https://developer.apple.com/library/prerelease/ios/documentation/CoreMedia/Reference/CMTime /index.html#//apple_ref/c/func/CMTimeMultiplyByFloat64 reemplazar su 'time.value = min (time.value, 2)' con 'tiempo = CMTimeMultiplyByFloat (tiempo, 0.5)' para una respuesta más clara y precisa. –

0

Esto va a resolver el problema de la rotación

generate.appliesPreferredTrackTransform = YES 
Cuestiones relacionadas