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. С тех пор я использовал этот способ, не стесняйтесь использовать его в качестве альтернативы, если это поможет.

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

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

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