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];

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

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

7 ответов

Решение

Удалось найти отличный способ с помощью 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.

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

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

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

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

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

но это не сработает

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

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

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

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

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

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

Код в 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)
}

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

+ Изменить

[[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 - то, что не будет работать. Я думаю, потому что уведомление не сработает.

Другие вопросы по тегам