仅在 iOS 8+ 上按下 beginSeekingForward 时 MPMoviePlayerController 停止/冻结视频

Posted

技术标签:

【中文标题】仅在 iOS 8+ 上按下 beginSeekingForward 时 MPMoviePlayerController 停止/冻结视频【英文标题】:MPMoviePlayerController stop/freezes video when beginSeekingForward is pressed only on iOS 8+ 【发布时间】:2015-02-03 23:40:32 【问题描述】:

我正在使用 MPMoviePlayerController 播放来自 url 的 .m3u 类型的一些流媒体视频。他们的视频播放器完美启动,视频也开始完美播放,但只要我按下 Seek Forward 或 Next 或 beginSeekingForward 按钮,视频就会完全停止/冻结。之后,我可以单击Done 关闭播放器或擦洗progress bar,它将返回播放视频。但是我无法点击play/pause,或者至少似乎什么也没做。

我花了很长时间在网上四处寻找答案或至少一个提示,以便我可以在正确的方向上解决这个问题,但不是运气。所以,我真的希望有人可以帮助解决这个问题。顺便说一句,这只发生在 ios 8+ 上,目前我正在 iOS 8.1 中测试它。

这就是我创建播放器并将视频加载到其中的方式。

NSURL *videoURL = [NSURL URLWithString:self.video.flvurl];

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: videoURL];
self.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
self.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
self.moviePlayer.shouldAutoplay = NO;
self.moviePlayer.fullscreen = YES;
self.moviePlayer.repeatMode = YES;

self.moviePlayer.view.backgroundColor = [UIColor blackColor];
self.moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.moviePlayer.view.frame = self.containerView.frame;


[self.view addSubview:self.moviePlayer.view];

[self.moviePlayer prepareToPlay];
[self.moviePlayer play];

我尝试使用多个不同的通知来查看我是否可以在其中一个通知中捕捉到这一点,但完全不是运气。到目前为止,我已经测试了所有这些通知。我已将其添加到 self.moviePlayerself.moviePlayer.view 中,但两者都不是运气。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(willResignActive:)
                                             name:UIApplicationWillResignActiveNotification
                                           object:self.moviePlayer.view];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(videoPlaybackDidFinish:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:self.moviePlayer.view];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(videoStartedPlaying:)
                                             name:MPMoviePlayerNowPlayingMovieDidChangeNotification
                                           object:self.moviePlayer.view];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(videoLoadState:)
                                             name:MPMoviePlayerLoadStateDidChangeNotification
                                           object:self.moviePlayer.view];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(videoPlaybackState:)
                                             name:MPMoviePlayerPlaybackStateDidChangeNotification
                                           object:self.moviePlayer.view];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(videoPlaybackUserInfoKey:)
                                             name:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey
                                           object:self.moviePlayer.view];

好吧,如果您需要更多相关代码,请告诉我。我真的需要一些帮助。在此先感谢。

【问题讨论】:

【参考方案1】:

这段代码对我有用,但只是为了摆脱冻结。像上面一样注册 MPMoviePlayerLoadStateDidChangeNotification。在回调方法中,我只是将电影播放器​​ contentURL 设置为我在开始时初始化它的原始 URL,然后将电影播放器​​设置为再次播放。

此功能的功能是当您在全屏模式下点击“下一步”或“返回”按钮时,视频会从头开始重新播放。这可能并不理想,因为用户可能不会想到这一点,但至少它会阻止它冻结。我目前正在尝试找到更好的解决方法。

- (void) videoLoadState:(NSNotification *)notification

    MPMovieLoadState loadState = moviePlayer.loadState;

    if(loadState == MPMovieLoadStateUnknown)
    
        NSLog(@"Movie Load state is unknown");
        moviePlayer.contentURL = currentlyPlayingVideoURL;
        [moviePlayer prepareToPlay];
    

如果你在这个方法中查看 MPMoviePlaybackState 的值,当按下 NEXT 或 BACK 时它总是 MPMoviePlaybackStateStopped,所以我不知道如何处理它......

【讨论】:

以上是关于仅在 iOS 8+ 上按下 beginSeekingForward 时 MPMoviePlayerController 停止/冻结视频的主要内容,如果未能解决你的问题,请参考以下文章

排毒:iOS 模拟器如何在键盘上按 Next

在父活动上按下后退按钮

在我的应用程序上按主页按钮时 iOS backboardd 崩溃

在Android上按下后退按钮时Runnable线程会发生啥?

如何在移动屏幕上按下按钮时发生动画?

iOS 简单视图从导航堆栈错误弹出