Получить ориентацию из видео или большого пальца, полученного с помощью AVAssetImageGenerator

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

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

person Andrea    schedule 03.12.2013    source источник


Ответы (4)


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

generator.appliesPreferredTrackTransform=true
person Hardik Mamtora    schedule 05.04.2014
comment
Удивительно. Спасибо - person LIH; 19.01.2017

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.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
person Abdul Yasin    schedule 26.05.2016

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

{
//..
        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];
//..
}
person Andrea    schedule 04.12.2013

-(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 — это URL-адрес видео.

person Sandeep Kumar Gupta    schedule 21.11.2015