ThumbnailImageAtTime: теперь не рекомендуется - какая альтернатива?

До обновления iOS7 я использовал...

UIImage *image = [moviePlayer thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];

... с большим успехом, так что мое приложение может показать по-прежнему видео, которое только что сделал пользователь.

Я понимаю этот метод, поскольку iOS7 теперь устарел, и мне нужна альтернатива. Я вижу там метод

- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option

но как мне вернуть изображение из него, чтобы я мог поместить его в изображение кнопки videoReview?

Спасибо, Джим.

**** Отредактированный вопрос, попробовав метод центра уведомлений ***

Я использовал следующий код -

[moviePlayer requestThumbnailImagesAtTimes:times timeOption:MPMovieTimeOptionNearestKeyFrame];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification::) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];

Я сделал NSArray раз из двух объектов NSNumber 1 и 2.

Затем я попытался зафиксировать уведомление по следующему методу

-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSDictionary*)info{

UIImage *image = [info objectForKey:MPMoviePlayerThumbnailImageKey];

Затем приступил к использованию этого миниатюрного изображения в качестве изображения кнопки в качестве предварительного просмотра.... но это не сработало.

Если вы видите из моей кодировки, где я ошибся, ваша помощь будет оценена снова. Приветствия

Ответ 1

Удалось найти отличный способ с помощью AVAssetImageGenerator, см. код ниже...

AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:partOneUrl options:nil];
AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
generate1.appliesPreferredTrackTransform = YES;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 2);
CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
UIImage *one = [[UIImage alloc] initWithCGImage:oneRef];
[_firstImage setImage:one];
_firstImage.contentMode = UIViewContentModeScaleAspectFit;

Внутри файла заголовка, пожалуйста, импортируйте

#import <AVFoundation/AVFoundation.h>

Он работает отлично, и я смог вызвать его из viewDidLoad, который был быстрее, чем вызов устаревшего thumbNailImageAtTime: из viewDidAppear.

Надеюсь, это поможет любому, у кого была такая же проблема.

Ответ 2

RequestThumbnailImagesAtTimes: метод timeOption: отправит уведомление MPMoviePlayerThumbnailImageRequestDidFinishNotification, когда запрос на изображение завершится. Ваш код, которому требуется уменьшенное изображение, должен подписаться на это уведомление с помощью NSNotificationCenter и использовать изображение, когда оно получает уведомление.

Ответ 3

Способ сделать это, по крайней мере, в iOS7 - использовать поплавки для вашего времени

NSNumber *timeStamp = @1.f;
[moviePlayer requestThumbnailImagesAtTimes:timeStamp timeOption:MPMovieTimeOptionNearestKeyFrame];

Надеюсь, что это поможет

Ответ 4

Jeely обеспечивает хорошую работу, но для этого требуется дополнительная библиотека, которая не нужна, когда MPMoviePlayer уже предоставляет функции для этой задачи. Я заметил синтаксическую ошибку в исходном коде плаката. Обработчик уведомлений эскизов ожидает объект типа NSNotification, а не объект словаря. Вот исправленный пример:

-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSNotification*)note
{
    NSDictionary * userInfo = [note userInfo];
    UIImage *image = (UIImage *)[userInfo objectForKey:MPMoviePlayerThumbnailImageKey];
    if(image!=NULL)
        [thumbView setImage:image];
}

Ответ 5

Проблема заключается в том, что вы должны указывать значения float в requestThumbnailImagesAtTimes.

Например, этот будет работать

[self.moviePlayer requestThumbnailImagesAtTimes:@[@14.f] timeOption:MPMovieTimeOptionNearestKeyFrame];

но этот не будет работать:

[self.moviePlayer requestThumbnailImagesAtTimes:@[@14] timeOption:MPMovieTimeOptionNearestKeyFrame];

Ответ 6

Я только что искал решение этой проблемы и получил хорошую помощь от вашего вопроса. Получил ваш код выше, чтобы работать с одним небольшим изменением, удалил двоеточие...

Изменить

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification::) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];

к

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];

Чтобы это работало хорошо. Кроме того, я обнаружил, что вы не можете вызывать метод, полагающийся на NotificationCenter, если вы уже находитесь в селекторе уведомлений. Сначала я попробовал - я попробовал позвонить requestThumbnailImagesAtTimes внутри селектора уведомлений для MPMoviePlayerPlaybackDidFinishNotification - то, что не будет работать. Я думаю, потому что уведомление не будет срабатывать.

Ответ 7

Код в Swift 2.1 будет выглядеть следующим образом:

do{
    let asset1 =  AVURLAsset(URL: url)
    let generate1: AVAssetImageGenerator = AVAssetImageGenerator(asset: asset1)
    generate1.appliesPreferredTrackTransform = true

    let time: CMTime = CMTimeMake(3, 1)  //TO CATCH THE THIRD SECOND OF THE VIDEO
    let oneRef: CGImageRef = try generate1.copyCGImageAtTime(time, actualTime: nil)
    let resultImage = UIImage(CGImage: oneRef)
}
catch let error as NSError{
    print(error)
}