Вопрос:

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

ios objective-c thumbnails video-thumbnails

17665 просмотра

5 ответа

6258 Репутация автора

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

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

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

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

Автор: Abishek Источник Размещён: 11.05.2011 11:37

Ответы (5)


18 плюса

6355 Репутация автора

Решение

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

+ (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.

Автор: Jesse Crossen Размещён: 21.06.2011 09:14

32 плюса

7958 Репутация автора

Лучшее решение на самом деле заключается в использовании инфраструктуры 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;
}
Автор: Werner Altewischer Размещён: 20.05.2012 08:38

3 плюса

9504 Репутация автора

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

Шаг 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;
}
Автор: Rajesh Loganathan Размещён: 16.04.2014 12:16

0 плюса

1053 Репутация автора

Попробуй это :

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

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

Автор: Ayush Goel Размещён: 20.04.2015 05:49

0 плюса

1823 Репутация автора

Код для решения, которое использует AVFoundationFramework и 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класса:

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

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

Значением по умолчанию является kCMTimePositiveInfinity.

Установите значения значения selectedTimeToleranceBefore и requiredTimeToleranceAfter для kCMTimeZero, чтобы запросить генерацию изображения с точностью до кадра; это может повлечь дополнительную задержку декодирования.

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

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

Значением по умолчанию является kCMTimePositiveInfinity.

Установите значения значения selectedTimeToleranceBefore и requiredTimeToleranceAfter для kCMTimeZero, чтобы запросить генерацию изображения с точностью до кадра; это может повлечь дополнительную задержку декодирования.

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

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

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

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

Автор: Rafał Augustyniak Размещён: 14.11.2016 11:12
Вопросы из категории :
32x32