Подтвердить что ты не робот

Создание миниатюры для видео в iOS

У меня есть приложение, которое я разрабатываю для iPhone. Что он делает, он захватывает видео с камеры и сохраняет видеофайл в Файловой системе.

Мне нужно создать миниатюрное изображение этого видеофайла, прежде чем я сохраню изображение в файловой системе. Мой мотив состоит в том, чтобы показать список миниатюр созданного видео, чтобы пользователь мог выбрать конкретную миниатюру для воспроизведения нужного файла.

Может кто-нибудь, пожалуйста, сообщите, как я могу создать изображение миниатюрного видеофайла, который был захвачен камерой.

Кроме того, можете ли вы сообщить, могу ли я создать миниатюру существующего видеофайла с помощью SDK для iOS.

4b9b3361

Ответ 1

Попробуйте (на самом деле это не показывает плеер):

+ (UIImage *)imageFromMovie:(NSURL *)movieURL atTime:(NSTimeInterval)time {
  // set up the movie player
  MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] 
    initWithContentURL:movieURL];
  mp.shouldAutoplay = NO;
  mp.initialPlaybackTime = time;
  mp.currentPlaybackTime = time;
  // get the thumbnail
  UIImage *thumbnail = [mp thumbnailImageAtTime:time 
                           timeOption:MPMovieTimeOptionNearestKeyFrame];
  // clean up the movie player
  [mp stop];
  [mp release];
  return(thumbnail);
}

Предполагается, что это синхронный вызов, поэтому он может блокировать основной поток, но, кажется, работает мгновенно для меня, когда я использую время в начале фильма. Если вы делаете это много, вы можете добавить его как категорию в UIImage, что я и сделал.

Я вижу из вашего вопроса, что вы хотите сделать это до того, как фильм будет сохранен, и я думаю, что это может не работать без URL-адреса файла. Однако, если вы используете UIImagePickerController для захвата камеры, вы можете передать эту функцию URL-адресу, возвращаемому в информационном словаре imagePickerController: didFinishPickingMediaWithInfo: с ключом UIImagePickerControllerMediaURL.

Ответ 2

Лучшим решением на самом деле является использование структуры AVFoundation для этого. Он обходит необходимость создания MPMoviePlayerController, который вызывает проблему, когда ирис камеры остается закрытой, если использовать ее в сочетании с UIImagePickerController (по крайней мере, то, что я испытал).

Код, который я использую:

+ (UIImage *)thumbnailFromVideoAtURL:(NSURL *)contentURL {
    UIImage *theImage = nil;
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:contentURL options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform = YES;
    NSError *err = NULL;
    CMTime time = CMTimeMake(1, 60);
    CGImageRef imgRef = [generator copyCGImageAtTime:time actualTime:NULL error:&err];

    theImage = [[[UIImage alloc] initWithCGImage:imgRef] autorelease];

    CGImageRelease(imgRef);
    [asset release];
    [generator release];

    return theImage;
}

Ответ 3

Очень просто попробуйте это...

Шаг 1: заголовок импорта #import <MediaPlayer/MediaPlayer.h>

Шаг 2. Получить URL-адрес.

NSURL *videoURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"m4v"]];

Шаг 3: наконец-то получим эскиз

- (UIImage *)VideoThumbNail:(NSURL *)videoURL
{
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
    UIImage *thumbnail = [player thumbnailImageAtTime:52.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
    [player stop];
    return thumbnail;
}

Ответ 4

Попробуйте следующее:

generate.requestedTimeToleranceBefore = kCMTimeZero;
generate.requestedTimeToleranceAfter = kCMTimeZero;

Нужно добавить, чтобы получить правильный фрейм.

Ответ 5

Код для решения, использующий структуру AVFoundation и Swift 3.0 (код с комментариями не нужен и обсуждается ниже кода - вам нужно решить, нужна ли вам это или нет):

import AVFoundation

func generateThumbnailForVideo(at url: URL) -> UIImage? {
    let kPreferredTimescale: Int32 = 1000
    let asset = AVURLAsset(url: url)
    let generator = AVAssetImageGenerator(asset: asset)
    generator.appliesPreferredTrackTransform = true
    //generator.requestedTimeToleranceBefore = kCMTimeZero
    //generator.requestedTimeToleranceAfter = kCMTimeZero
    //generator.maximumSize = CGSize(width: 100, height: 100)

    var actualTime: CMTime = CMTime(seconds: 0, preferredTimescale: kPreferredTimescale)
    //generates thumbnail at first second of the video
    let cgImage = try? generator.copyCGImage(at: CMTime(seconds: 1, preferredTimescale: kPreferredTimescale), actualTime: &actualTime)
    return cgImage.flatMap() { return UIImage(cgImage: $0, scale: UIScreen.main.scale, orientation: .up) }
}

Обратите внимание, что вы можете использовать этот код в фоновом потоке, поскольку создание миниатюр может быть потенциально дорогостоящим.

Кроме того, ознакомьтесь с некоторыми свойствами класса AVAssetImageGenerator:

Максимальная длина времени до заданного времени, для которого может быть сгенерировано изображение.

Значение по умолчанию - kCMTimePositiveInfinity.

Задайте значения requestTimeToleranceBefore и requestTimeToleranceAfter для kCMTimeZero, чтобы запросить формирование изображения с точностью до кадра; это может повлечь за собой дополнительную задержку декодирования.

  1. requestedTimeToleranceAfter (Документация Apple):

Максимальный период времени после запрошенного времени, для которого может быть сгенерировано изображение.

Значение по умолчанию - kCMTimePositiveInfinity.

Задайте значения requestTimeToleranceBefore и requestTimeToleranceAfter для kCMTimeZero, чтобы запросить формирование изображения с точностью до кадра; это может повлечь за собой дополнительную задержку декодирования.

  1. maximumSize (Документация Apple):

Определяет максимальные размеры сгенерированного изображения.

Значением по умолчанию является CGSizeZero, в котором указываются размеры безмасштабированных активов.

AVAssetImageGenerator масштабирует изображения так, чтобы они соответствовали определенному ограничивающему прямоугольнику. Изображения никогда не расширяются. Соотношение сторон масштабируемого изображения определяется свойством apertureMode.