【发布时间】:2012-10-11 22:02:59
【问题描述】:
我在应用测试期间遇到了一个奇怪的行为。
该应用程序包含一个由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
处理播放按钮的代码:
-(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)上进入全屏时,viewWillDisapear 和 viewDidDisappear 会被调用。
解决方案是确保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;
}
}
【问题讨论】:
-
您是否在 viewWillDisappear 或 viewDidDisappear 中执行任何会导致视频停止的操作?这就是吸引我的原因。
-
你是对的。当视图消失时,我正在释放电影播放器。
-
因此,在放弃控制器之前将我的支票从
if(self.mpController)更新为if(self.mpController && !self.mpController.fullscreen)确实解决了这个问题。我喜欢他们改变 stuf 的调用方式:p -
将我的评论升级为答案:)
标签: ios ios6 mpmovieplayercontroller