13

iOS 7 で MPMoviePlayerController の問題に直面しています。全画面表示にしてから、前方シーク ボタン (>>|) をクリック (シングル タップ) すると、ビデオの再生が終了し、「読み込み中」というテキストが表示された黒い画面が表示されます。ヘッダーに。

「 MPMoviePlayerPlaybackStateDidChangeNotification 」の通知を登録しました。

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

シークフォワードボタンを1回クリックしても起動しません。

「 MPMoviePlayerPlaybackDidFinishNotification」の登録についても

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

シークフォワードボタンを1回クリックすると、「MPMovieFinishReasonPlaybackEnded 」イベントが発生します。その理由を知っている人はいますか?これはアップルのバグですか?

シングルクリックで黒い画面を表示するこの動作を停止するか、シークフォワードボタンのシングルクリックを無効にして何も起こらないようにする必要があります。

これを達成する方法を知っている人はいますか?

4

3 に答える 3

2

MPMoviePlayer オブジェクトを完全に削除し、nil に設定し、スーパービューから削除して、元のビデオ 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;
      }
    }

moviePlayerPlaybackStateDidChangeNotification の switch ステートメントの直前に、NSURL を保持する方法に注意してください。そうすれば、MPMoviePlayer オブジェクトを再初期化して再追加できます。

ところで、私の mpmovieplayer は tableviewCell 上にあります。ご不明な点がございましたら、お気軽にお問い合わせください。幸運を!

于 2014-08-26T21:10:25.947 に答える
2

MPMoviePlayerLoadStateDidChangeNotification は、早送りまたは巻き戻しボタンを 1 回タップすると呼び出されます。loadState を確認して、ビデオへのパスを指定し、prepareToPlay を再度実行する必要があります。

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

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

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

    .....
}
于 2014-10-31T07:31:01.497 に答える
0

MPMovieFinishReasonPlaybackEnded を取得する理由は、再生がビデオの最後に達したためです (これが明らかな場合は申し訳ありません)。したがって、あなたのシークフォワード アクションは、ビデオの最後までシークしているようです。で再生状態を確認できますMPMoviePlaybackStateSeekingForward

簡単な解決策は、指定された時間 (つまり 5 秒) だけ先にシークする独自の進むボタンを作成することです。しかし、おそらくこれはあなたが探している機能ではありません。

于 2013-10-24T16:48:48.670 に答える