2013-10-24 4 views
13

iOS 7のMPMoviePlayerControllerに問題があります。フルスクリーンを入力して、シークボタン(>>)をクリックします|)、ビデオ再生が終了し、ヘッダーに "Loading"というテキストの黒い画面が表示されます。iOS 7 MPMoviePlayerController seek forwardボタンを押すとビデオが終了し、黒い画面が表示されます

"MPMoviePlayerPlaybackStateDidChangeNotification"の通知を登録しました。

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

シークフォワードボタンを1回クリックするだけでは起動しません。私はイベント "をMPMovieFinishReasonPlaybackEnded" 取得

" MPMoviePlayerPlaybackDidFinishNotification"

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

の登録にも

は、前方にシークボタンのシングルクリックで解雇しました。 その理由を知っている人はいますか?これはリンゴのバグですか?

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

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

+0

動画のエンコードのような音です。よく練習した/よく知られているコンテンツの例(例:アップルの[BipBop](http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8)! – Till

+1

しかしその場合、ビデオは全く再生されないはずです。私は、前方確認ボタンを押すと、この問題に直面しています。そのボタンを長押しすると、ビデオは正常に終了するようになります。 – XYZ

+0

あなたの前提が正しくありません。エンコード(例えば、Iフレームレート)は、シーク挙動に著しい影響を及ぼす。 – Till

答えて

0

MPMovieFinishReasonPlaybackEndedが表示されるのは、再生がビデオの最後に達したためです(これが明白な場合はごめんなさい)。だからあなたの求める前向きな行動は、ビデオの最後まで捜しているようです。 MPMoviePlaybackStateSeekingForwardで再生状態を確認できます。

早急に解決策を見つけるには、特定の時間(つまり5秒)先行する自分の前方ボタンを作成することができます。しかしおそらく、これはあなたが探している機能ではありません。

+1

再生状態MPMoviePlaybackStateSeekingForwardでチェックしました。私が前方に進むボタンを長押ししたときにだけ発砲する。私はそのボタンを長押ししないで、シングルクリックの動作を制御する必要があります。 – XYZ

+0

標準のプレーヤーボタンとのユーザーのやりとりで通知が発生しないと思うので、これを実装する必要があります。これは、プレーヤーコントロール用の独自のUIです。ワンタッチ、ロングタッチなどのアクションを決定することができます。プレイレートを上げる、時間を追うなどの機能を追加できます。 iOSでは、MPMoviePlayerはプレイ、一時停止、前、次を提供するシンプルなプレーヤーです。 – timgcarlson

+0

timgcarlson:前のボタンまたは次のボタンをクリックしたときに再生できる他のビデオトラックがあるかどうかを確認するにはどうすればよいですか? – XYZ

2

MPMoviePlayerオブジェクトを完全に削除し、それをnilに設定してスーパービューから削除し、元のビデオURLを使用して再追加することで修正しました。以下のコード:私は右moviePlayerPlaybackStateDidChangeNotificationでswitch文の前に、NSURLを保つ方法

- (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; 
     } 
    } 

注意してください。こうすることで、MPMoviePlayerオブジェクトを再初期化して再追加できます。

Btw、私のmpmovieplayerはあなたが疑問に思うならtableviewCellにあります。希望があれば、これが助けてくれたらと思っています。がんばろう!

2

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

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

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

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

    ..... 
} 
関連する問題