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