Подтвердить что ты не робот

Кнопка iOS 7 MPMoviePlayerController seek forward возвращает видео в конец и отображает черный экран

Я сталкиваюсь с проблемой с MPMoviePlayerController в iOS 7. Я вхожу в полноэкранный режим, а затем нажимаю (только один раз) на кнопку поиска вперед ( → |), и воспроизведение видео заканчивается и дает черный экран с текстом "Загрузка" в заголовке.

Я зарегистрировал уведомление для " MPMoviePlayerPlaybackStateDidChangeNotification".

**[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(moviePlayerPlaybackStateDidChange:)
                                                 name:MPMoviePlayerPlaybackStateDidChangeNotification
                                               object:self.player];**

Он не запускается одним нажатием кнопки поиска вперед.

Также при регистрации " MPMoviePlayerPlaybackDidFinishNotification"

**[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(moviePlayerPlaybackDidFinish:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:nil];**

Я получаю событие MPMovieFinishReasonPlaybackEnded ", которое запускается одним нажатием кнопки поиска вперед. Кто-нибудь знает причину? Это ошибка в яблоке?

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

Кто-нибудь знает, как это достичь?

4b9b3361

Ответ 1

Я исправил это, полностью удалив объект MPMoviePlayer, установив его на нуль, удалив из него супервизор и повторно добавив его с использованием исходного URL-адреса URL. Код ниже:

- (void)addPlayerForUrl:(NSURL *)url {
  self.player = [[MPMoviePlayerController alloc] initWithContentURL:url];
  self.player.view.frame = self.videoView.bounds;
  self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  self.player.controlStyle = MPMovieControlStyleDefault;
  [self.videoView insertSubview:self.player.view atIndex:0];

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(moviePlayerLoadStateDidChangedNotification:)
                                               name:MPMoviePlayerReadyForDisplayDidChangeNotification
                                             object:self.player];

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(moviePlayerPlaybackStateDidChangeNotification:)
                                               name:MPMoviePlayerPlaybackStateDidChangeNotification
                                             object:self.player];
}


#pragma mark - Notifications

- (void)moviePlayerLoadStateDidChangedNotification:(NSNotification *)notification {
  self.isVideoPreloaded = YES;
  self.videoPlayButton.hidden = YES;
  self.photoImageView.hidden = YES;
  self.videoLoadingImageView.hidden = YES;
}
- (void)moviePlayerPlaybackStateDidChangeNotification:(NSNotification *)notification {
      NSURL *url = self.player.contentURL;
      switch (self.player.playbackState) {
        case MPMoviePlaybackStateSeekingBackward:
        case MPMoviePlaybackStateSeekingForward:
          break;
        case MPMoviePlaybackStatePlaying:
          self.videoPlayButton.hidden = YES;

          if (!self.isVideoPreloaded) {
            self.videoLoadingImageView.hidden = NO;
            [self.videoLoadingImageView startAnimating];
          } else {
            self.videoLoadingImageView.hidden = YES;
          }
          break;
        case MPMoviePlaybackStatePaused:
        case MPMoviePlaybackStateStopped:
          self.videoPlayButton.hidden = NO;
          self.videoLoadingImageView.hidden = YES;
          [self.player endSeeking];
          [self.player.view removeFromSuperview];
          [self.player setFullscreen:NO];
          self.player = nil;
          [self addPlayerForUrl:url];
          break;
        default:
          break;
      }
    }

Обратите внимание, как я сохраняю NSURL, прямо перед оператором switch в moviePlayerPlaybackStateDidChangeNotification. Таким образом, я могу повторно инициализировать и повторно добавить объект MPMoviePlayer.

Btw, мой mpmovieplayer находится на tableviewCell, если вам интересно. Надеюсь, что это поможет, и дайте мне знать, если у вас есть вопросы. Удачи!

Ответ 2

MPMoviePlayerLoadStateDidChangeNotification будет вызываться, когда вы нажимаете кнопку быстрой перемотки вперед или назад. Вы должны проверить loadState и просто дать ему путь к вашему видео и снова подготовитьPoPlay.

- (void)moviePlayerLoadStateChanged:(NSNotification *)notification {

    MPMoviePlayerController *moviePlayer = notification.object;
    MPMovieLoadState loadState = moviePlayer.loadState;

    if(loadState == MPMovieLoadStateUnknown) {
        moviePlayer.contentURL = [NSURL fileURLWithPath:videoPath]
        [moviePlayer prepareToPlay];
    }

    .....
}

Ответ 3

Причина, по которой вы получаете MPMovieFinishReasonPlaybackEnded, заключается в том, что воспроизведение достигло конца видео (извините, если это очевидно). Таким образом, кажется, что ваши поисковые действия ищут все пути до конца видео. Вы можете проверить состояние воспроизведения с помощью MPMoviePlaybackStateSeekingForward.

Быстрое решение может состоять в том, чтобы создать свою собственную кнопку вперед, которая ищет вперед в указанное время (то есть 5 секунд). Но, возможно, это не функциональность, которую вы ищете.