【问题标题】:iOS 7 MPMoviePlayerController seek forward button brings the video to the End and displays Black screeniOS 7 MPMoviePlayerController 向前搜索按钮将视频带到结束并显示黑屏
【发布时间】:2013-11-03 10:48:02
【问题描述】:

我在 iOS 7 中遇到 MPMoviePlayerController 的问题。我进入全屏模式,然后单击(只需单击一下)向前搜索按钮 (>>|) ,视频播放结束并出现带有文本的黑屏标题上的“正在加载”。

我为“MPMoviePlayerPlaybackStateDidChangeNotification”注册了通知。

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

单击前进按钮不会触发它。

还有关于“MPMoviePlayerPlaybackDidFinishNotification”的注册

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

单击“向前搜索”按钮会触发“MPMovieFinishReasonPlaybackEnded”事件。 有谁知道原因吗?这是苹果的bug吗?

我需要停止这种单击时显示黑屏的行为,或者只是禁用单击前进按钮的单击,这样什么都不会发生。

任何人都知道如何实现这一目标?

【问题讨论】:

  • 听起来像一个视频编码问题 - 确保您针对一些格式良好/众所周知的内容示例进行测试,例如苹果BipBop!
  • 但在这种情况下,根本不应该播放视频。我只有在按下“向前搜索”按钮时才会遇到这个问题,而且单击一下。如果我长按那个按钮,视频会正确结束。
  • 我尝试过使用 Apple 的 BipBop。但同样的行为。当我单击按钮时,它会显示一个始终旋转的黑屏并显示“正在加载...”
  • @XYZ 嘿,你找到解决这个问题的方法了吗?
  • 我认为是iOS的bug。

标签: ios objective-c mpmovieplayercontroller


【解决方案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];
    }

    .....
}

【讨论】:

    【解决方案2】:

    我通过完全删除 MPMoviePlayer 对象、将其设置为 nil、将其从超级视图中删除并使用原始视频 Url 重新添加来解决此问题。代码如下:

    - (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 上。希望这会有所帮助,如果您有任何问题,请告诉我。祝你好运!

    【讨论】:

      【解决方案3】:

      您收到 MPMovieFinishReasonPlaybackEnded 的原因是因为播放到了视频的结尾(很抱歉,如果这很明显)。因此,您的前向搜索操作似乎一直在搜索视频的结尾。您可以通过MPMoviePlaybackStateSeekingForward查看播放状态。

      一个快速的解决方案可能是创建您自己的前进按钮,该按钮在指定时间(即 5 秒)前搜索。但也许这不是您想要的功能。

      【讨论】:

      • 我检查了播放状态 MPMoviePlaybackStateSeekingForward。只有当我长按搜索前进按钮时才会触发它。我需要控制单击的行为而不是长按该按钮。
      • 我认为用户与标准播放器按钮的交互不会触发任何通知,这就是为什么您必须为播放器控件实现自己的 UI。然后,您可以确定单次触摸、长按等的操作……然后,您可以添加任何您希望的功能,例如提高播放速率,或者只是寻找时间。在 iOS 上,MPMoviePlayer 是一个简单的播放器,可以播放、暂停、上一个和下一个。
      • timgcarlson : 您知道当您单击上一个或下一个按钮时,我们如何检查是否还有其他可播放的视频轨道?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多