0

我在应用程序测试期间遇到了一个奇怪的行为。该应用程序包含一个由 a 播放的视频流,MPMoviePlayer当在 iOS6 上进入全屏(通过播放器控制器上的按钮)时,屏幕变为空白并且电影停止播放。在 iOS5 上,电影按预期继续。

我相信这将是 iOS6 中的一个错误,因此想知道:
- 还有其他人经历过这种行为吗?
- 这是我的代码中的错误,还是操作系统中的错误?- 关于如何处理它的任何建议?

在两部手机上,当视频包含在屏幕上的帧中(作为视图的一部分)时,视频流会按预期播放。但是,当进入全屏时,它们会有所不同。我已经在两部手机上拍摄了这种行为。

在相对较新的 iPhone 4S(运行 iOS 5.1.1)上,以下(预期)行为:http: //4340.no/ios5.mov

在 iPhone 3S(升级到 iOS 6.0)上,出现以下(意外)行为:http: //4340.no/ios6.mov

处理 playButton 的代码:

-(IBAction) playButtonClicked:(id)sender
{    
    NSURL* url = [NSURL URLWithString:self.experiment.videoPath];
    self.mpController = [[MPMoviePlayerController alloc] initWithContentURL:url];
    [self.mpController prepareToPlay];
    self.mpController.view.frame = CGRectMake(0, 0, 320, 214);
    [self.view addSubview:self.mpController.view];

    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(movieFinishedCallback:)                                                 
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:self.mpController];

    [self.mpController play];
}

任何有关如何解决此问题的提示或建议将不胜感激。

验尸 - 代码和解释:

当电影在iOS6 (而不是 iOS5)上进入全屏时,结果会被调用viewWillDisapearviewDidDisappear

解决方案是确保在以这两种方法中的任何一种关闭视频播放器之前MPMovieplayerController都没有运行。fullscreen

然后我的新代码变成
了:(注意&& !self.mpController.fullscreen

-(void)viewDidDisappear:(BOOL)animated
{
    if(self.mpController && !self.mpController.fullscreen){
        [[NSNotificationCenter defaultCenter]
            removeObserver:self
            name:MPMoviePlayerPlaybackDidFinishNotification
         object:self.mpController];
        [self.mpController.view removeFromSuperview];
        self.mpController = nil;
    }
}
4

1 回答 1

1

确保您没有在 viewWillDisappear 或 viewDidDisappear 中停止或释放视频播放器。

于 2012-10-11T13:44:07.437 回答