MediaPlayer -requestThumbnailImagesAtTimes не запускает уведомление
У меня проблемы с извлечением миниатюр изображений из фильмов с MPMoviePlayerController
-requestThumbnailImagesAtTimes: timeOption:
Я на 99% уверен, что все настроил правильно; Я просто не получаю эти уведомления вообще.
Я изначально работал в ReactiveCocoa
; чтобы сузить возможности у меня есть хотя бы минимальный разбитый пример без него.
Минимальный сломанный пример:
@import MediaPlayer;
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
// 1. register the observer before requesting the thumbnails
[[NSNotificationCenter defaultCenter] addObserverForName:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
// 4. this never gets hit
NSLog(@"%@", note.name);
}];
// 2. this works fine - media url is correct etc
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[info objectForKey:UIImagePickerControllerMediaURL]];
// 3. previously was using integers instead of floats; fixed that but this still doesn't do anything
[moviePlayer requestThumbnailImagesAtTimes:@[ @0.0f, @1.0f ] timeOption:MPMovieTimeOptionExact];
// ...
}
Оригинальный пример в ReactiveCocoa
@import MediaPlayer;
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
// 1. set the file URL
self.viewModel.movieURL = [info objectForKey:UIImagePickerControllerMediaURL];
// ...
}
// in viewmodel
- (void)viewDidLoad {
RACSignal *moviePlayerSignal = [[RACObserve(self, movieURL) ignore:nil] map:^id(NSURL *url) {
// 2. this allocates correctly
return [[MPMoviePlayerController alloc] initWithContentURL:url];
}];
// 3. observe the moviePlayerSignal;
[[[moviePlayerSignal map:^id(MPMoviePlayerController *player) {
@strongify(self);
NSLog(@"%@", player); // checking that the player exists etc - it does; all good here.
// register the observer before we request the thumbnail
RACSignal *notification = [[[NSNotificationCenter defaultCenter] rac_addObserverForName:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:player] takeUntil:[self rac_willDeallocSignal]];
// request the thumbnail
[player requestThumbnailImagesAtTimes:@[ @0.0f ] timeOption:MPMovieTimeOptionExact];
// map the signal into a stream of signals on the observer
return notification;
// if we subscribeNext without flattening we correctly get back RACSignals every time
}] flatten] subscribeNext:^(id x) {
// the flattened signal never gets a next because the player isn't firing notifications :(
NSLog(@"WHY DOESN'T THIS WORK!?");
}];
}
3 ответа
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didReceiveImage:)
name:MPMoviePlayerThumbnailImageRequestDidFinishNotification
object:self.player];
Смотрите объект уведомления. Вам нужно установить его как MPMoviePlayerController. Так что это должно быть написано после инициализации MPMoviePlayerController.
Возможно, вам просто нужно настроить свое уведомление немного по-другому (и раньше).
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mySelector)
name:MPMoviePlayerThumbnailImageRequestDidFinishNotification
object:self.player];
}
-(void)mySelector {
NSLog(@"Booya");
}
Первоначально (после thumbnailImageAtTime: устарело) у меня также была проблема с получением requestThumbnailImagesAtTimes: timeOption:
чтобы стрелять правильно, хотя я нашел эффективный способ создания миниатюр из видео через AVAssetImageGenerator. С тех пор я использовал этот способ, не стесняйтесь использовать его в качестве альтернативы, если это поможет.
Пожалуйста, смотрите ссылку на мой предыдущий ответ о том, как его использовать.