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

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

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

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

【问题讨论】:

    标签: ipad mpmovieplayercontroller fullscreen


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多