2013-12-03 3 views
6

В моем приложении я создаю видео с отдельных изображений. Все работает отлично, видео собраны правильно с правильным размером и ориентацией. Они отображаются корректно как в приложении Apple для фото, так и в MPMoviePlayer и в изолированной папке, где я их сохраняю.
Проблема возникает, когда я пытаюсь получить большой палец из фильма. Ориентация неправильная, и я не знаю, как исправить, я видел, что есть свойство - preferredTransform, но результат тот же для пейзажного и портретного видео.
URL-адрес, который я использую, - это путь к папке песочницы. Вот фрагмент кода:
Получить ориентацию от видео или большого пальца, полученного с помощью AVAssetImageGenerator

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

ответ

38

Просто используйте это, нет необходимости писать какие-либо методы

generator.appliesPreferredTrackTransform=true 
+0

Великий ... правильно! – Andrea

+0

Очень полезно, спасибо –

+0

Amazing. благодаря – LIH

0

На данный момент я нашел трюк, найти поворот видео и применить к миниатюре. Кажется, это работает, но я уверен, что есть другой способ. Решение взято из этого gist, кредиты Luca Bernardi.

{ 
//.. 
     NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; 
     AVAssetTrack* videoTrack = [videoTracks firstObject]; 
     CGAffineTransform txf  = [videoTrack preferredTransform];   
     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]; 
//.. 
} 
0
-(UIImage *)generateThumbImage : (NSURL *)url 
{ 
    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; 
} 

Где гиперссылка является URL видео.

1

СВИФТ версия

  // 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.appliesPreferredTrackTransform = 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 
     } 

Наиболее важное направление для ориентации:

imgGenerator.appliesPreferredTrackTransform = true