MPMoviePlayerController 在全屏模式下向前搜索,直到结束卡住

Posted

技术标签:

【中文标题】MPMoviePlayerController 在全屏模式下向前搜索,直到结束卡住【英文标题】:MPMoviePlayerController seek forward in fullscreen mode until end is stuck 【发布时间】:2011-08-08 13:12:00 【问题描述】:

MPMoviePlayerController 似乎存在问题,一旦您处于全屏模式并按住快进按钮,让它一直向前搜索(以快速播放)直到视频结束。

此后,您只是黑屏并且卡住了。换句话说,它不会响应任何轻击手势,您无法摆脱这种情况。有没有其他人遇到过这个问题?

有没有办法在代码中解决它?

【问题讨论】:

【参考方案1】:

这似乎是一个 ios 错误,因为快退到一开始不会导致黑屏,但快进到最后会,之后对视频播放器的“播放”/“暂停”调用将无法正常工作。我通过在洗涤器刷新回调中添加受保护的逻辑来临时解决此问题: 让我们假设 monitorPlaybackTime 将在 'PLAY_BACK_TIME_MONITOR_INTERVAL' 秒内被调用以刷新清理器,并在其中添加一个检查逻辑:

NSTimeInterval duration = self.moviePlayer.duration;
NSTimeInterval current = self.moviePlayer.currentPlaybackTime;

if (isnan(current) || current > duration) 
    current = duration;
 else if (self.moviePlayer.playbackState == MPMoviePlaybackStateSeekingForward) 
    if (current + self.moviePlayer.currentPlaybackRate*PLAY_BACK_TIME_MONITOR_INTERVAL > duration) 
        [self.moviePlayer endSeeking];
    

一个解决黑屏的方法,不完美,希望能有所帮助。

【讨论】:

谢谢@olinYY! playableDuration 在那里做什么?你声明了它然后不使用它? @Tony,这个sn-p只是整个功能代码的一部分,所以playableDuration用于其他用途,粘贴前忘记删除了,打扰了。【参考方案2】:

我猜你没有处理MPMoviePlayerPlaybackDidFinishNotification。如果你不是,你真的应该这样做。

电影播放器​​会像您描述的那样进入“卡住”状态,这对我来说仍然是出乎意料的。我更愿意期待它自动停止播放并在播放结束时重置。无论如何,我认为如果您观察 MPMoviePlayerPlaybackDidFinishNotification 并适当地处理电影控制器,您的问题就会消失。

【讨论】:

我已尝试处理此通知,但我不知道如何解决此问题。我真的认为这是一个Apple错误。换句话说,我只希望默认控件存在。如果您将控件样式设置为 MPMovieControlStyleFullscreen,我认为即使不进入全屏模式,您也可以重现该问题。 @hey68you 等等,你失去了我。你必须再次解释自己。您的电影实际上是嵌入的(不是全屏的)并且您将控件设置为 MPMovieControlStyleFullscreen? 这里是顺序。 step1: 创建一个电影播放器​​控制器并将 player.view 添加为子视图(设置其帧 [player play];(不要设置任何控件样式)step2 : 在运行时播放视频时轻按播放器以调出控件并轻按全屏图标(或只需捏合即可缩放至全屏。第 3 步: 再次轻按以调出具有 ff 按钮的全屏控件。步骤 4: 按住 ff 按钮直到播放结束。显示全黑屏幕,并且不处理任何点击或捏合;不退出就无法退出应用程序---【参考方案3】:

在 iOS6 上遇到了同样的问题。通过以下实现注册 MPMoviePlayerPlaybackDidFinishNotification(由 Leuguimerius 建议)设法修复它:

- (void)playbackDidFisnish:(NSNotification *)notif 
    if (self.player.currentPlaybackTime <= 0.1) 
    dispatch_async(dispatch_get_main_queue(), ^
        [self.player stop];
        [self.player play];
        [self.player pause];
        );
    

其中 self.player 是关联的 MPMoviePlayerController 实例。对 currentPlaybackTime 的检查用于区分更标准的playbackDidFinish 调用(允许电影以正常速度播放直到结束)与用户快进直到结束的场景。停止然后播放和暂停会产生一个可用的、视觉上一致的界面,即使快进到最后也是如此。

【讨论】:

【参考方案4】:

上述解决方案都不适合我,所以这就是我最终要做的:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("moviePlayerLoadStateDidChange"), name: MPMoviePlayerLoadStateDidChangeNotification, object: nil)

func moviePlayerLoadStateDidChange() 
    let loadState = moviePlayerController?.loadState

    if loadState == MPMovieLoadState.Unknown 
        moviePlayerController?.contentURL = currentmovieURL
        moviePlayerController?.prepareToPlay()
    

我认为问题在于,当单按前进按钮时,它想跳到下一个视频,这就是出现加载指示器的原因。监听加载状态改变事件,你可以指定下一个视频应该是什么,如果你没有,你可以给它相同的url。

【讨论】:

以上是关于MPMoviePlayerController 在全屏模式下向前搜索,直到结束卡住的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MPMoviePlayerController 上处理多个 SRT 文件

在 MPMoviePlayerController 上执行捏合手势时屏幕黑屏

在 UITableViewCell 中嵌入 MPMoviePlayerController

MPMoviePlayerController 在影片结尾更改控件样式

后台的 MPMoviePlayerController / AVAudioSession 在来电后不会重新开始播放

MPMoviePlayerController 在启动前显示空白屏幕?