iOS 7 MPMoviePlayerController seek forwardbutton将video带到End并显示黑屏

我在iOS 7中遇到了MPMoviePlayerController的一个问题。我进入全屏模式,然后在查找前进button(>> |)上单击(仅单击一次),video播放结束,并显示一个带有“正在载入”文本的黑屏。在标题上。

我注册了“ MPMoviePlayerPlaybackStateDidChangeNotification ”的通知。

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

它不会被点击寻找前进button被解雇。

另外注册“ MPMoviePlayerPlaybackDidFinishNotification

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

我得到“ MPMovieFinishReasonPlaybackEnded ”事件发射的单击寻求前进button。 任何人都知道原因? 这是苹果的错误吗?

我需要停止单击显示黑屏的行为,或者只是禁用单击查找前进button,以免发生任何事情。

任何人都知道如何做到这一点?

我通过完全删除MPMoviePlayer对象来解决这个问题,将其设置为零,将其从超级视图中移除,并使用原始videoUrl重新添加它。 代码如下:

 - (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,如果你想知道。 希望这有帮助,让我知道如果你有问题。 祝你好运!

当您单击快进或快退button时,将会调用MPMoviePlayerLoadStateDidChangeNotification。 你应该检查loadState,并只是给你的video和prepareToPlay的path了。

 - (void)moviePlayerLoadStateChanged:(NSNotification *)notification { MPMoviePlayerController *moviePlayer = notification.object; MPMovieLoadState loadState = moviePlayer.loadState; if(loadState == MPMovieLoadStateUnknown) { moviePlayer.contentURL = [NSURL fileURLWithPath:videoPath] [moviePlayer prepareToPlay]; } ..... } 

你得到MPMovieFinishReasonPlaybackEnded的原因是因为播放到达video的末尾(对不起,如果这是显而易见的)。 所以这似乎是你寻求前进的动作是一直寻findvideo的尽头。 您可以使用MPMoviePlaybackStateSeekingForward来检查播放状态。

一个快速的解决scheme可能是创build自己的前进button,在指定的时间(即5秒)前进。 但也许这不是你正在寻找的function。