Obtenga orientación del video o el pulgar obtenido con AVAssetImageGenerator

En mi aplicación, creo videos de imágenes individuales. Todo funciona bien, los videos se ensamblan correctamente con el tamaño y la orientación correctos. Se muestran correctamente tanto en la aplicación de fotos Apple, desde MPMoviePlayer y desde el directory de sandbox donde los guardo.
El problema surge cuando trato de get un pulgar de una película. La orientación no es correcta y no sé cómo arreglar, he visto que hay una propiedad prefernetworkingTransform Transform, pero el resultado es el mismo para los videos de paisaje y retratos.
La URL que estoy usando es la ruta del directory de sandbox. Aquí está el fragment:

 - (void) setVideoPath:(NSString *)videoPath { if (videoPath ==_videoPath) { return; } _videoPath = videoPath; AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:_videoPath]]; 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); self.videoImageView.image = thumbnail; } 

Simplemente use esto, no es necesario escribir ningún método

 generator.appliesPrefernetworkingTrackTransform=true 

Versión SWIFT

  // generate thumb from video and set it var err: NSError? = nil let asset = AVURLAsset(URL: NSURL(fileURLWithPath: videoPath! as String), options: nil) let imgGenerator = AVAssetImageGenerator(asset: asset) imgGenerator.appliesPrefernetworkingTrackTransform = true let cgImage: CGImage! do { cgImage = try imgGenerator.copyCGImageAtTime(CMTimeMake(0, 60), actualTime: nil) let thumbnail = UIImage(CGImage: cgImage) } catch let error as NSError { err = error cgImage = nil } 

Línea de orientación más importante:

 imgGenerator.appliesPrefernetworkingTrackTransform = true 

Por el momento he encontrado un truco, encuentro la rotation del video y aplico a la miniatura. Parece que funciona pero estoy bastante seguro de que hay otra forma de evitarlo. La solución se toma de esta forma, créditos para Luca Bernardi.

 { //.. NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; AVAssetTrack* videoTrack = [videoTracks firstObject]; CGAffineTransform txf = [videoTrack prefernetworkingTransform]; if (txf.a == 0 && txf.b == 1.0 && txf.c == -1.0 && txf.d == 0) { thumbOrientation = UIImageOrientationRight; } if (txf.a == 0 && txf.b == -1.0 && txf.c == 1.0 && txf.d == 0) { thumbOrientation = UIImageOrientationLeft; } if (txf.a == 1.0 && txf.b == 0 && txf.c == 0 && txf.d == 1.0) { thumbOrientation = UIImageOrientationUp; } if (txf.a == -1.0 && txf.b == 0 && txf.c == 0 && txf.d == -1.0) { thumbOrientation = UIImageOrientationDown; } UIImage *thumbnail = [UIImage imageWithCGImage:imageRef scale:[[UIScreen mainScreen]scale] orientation:thumbOrientation]; //.. } 
 -(UIImage *)generateThumbImage : (NSURL *)url { AVAsset *asset = [AVAsset assetWithURL:url]; AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; imageGenerator.appliesPrefernetworkingTrackTransform = 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; } 

Donde url es video url.