MPMoviePlayerController在iOS6中进入全屏后中断/停止

我有一个MPMoviewPlayerViewControllerembedded到UIView对象。 当我在embedded式模式下启动播放器时,一切正常,并按预期进行。 如果用户点击全屏切换(或者如果我使用setFullscreen:animated以编程方式更改为全屏),则播放器全屏显示,电影播放另一秒,之后屏幕变黑,仅显示“ Loading … ”消息。

此行为仅在iOS 6(也是iPad 6.0 Simulator)上出现,在运行iOS 5的设备上一切正常。

电影来源是应用程序包中的本地文件。

在播放和进入全屏时,debugging输出如下:

 2012-09-26 15:24:48.251 [39895:c07] [MPAVController]自动播放:停用自动播放暂停
 2012-09-26 15:24:48.252 [39895:c07] [MPAVController]自动播放:禁用自动播放
 2012-09-26 15:24:48.262 [39895:c07] [MPAVController]自动播放:启用自动播放
 2012-09-26 15:24:48.265 [39895:c07] [MPAVController]自动播放:可能保持或满缓冲区:0
 2012-09-26 15:24:48.266 [39895:c07] [MPAVController]自动播放:跳过自动播放,没有足够的缓冲跟上。
 2012-09-26 15:24:48.267 [39895:c07] [MPAVController]自动播放:可能保持或满缓冲区:0
 2012-09-26 15:24:48.268 [39895:c07] [MPAVController]自动播放:跳过自动播放,没有足够的缓冲跟上。
 2012-09-26 15:24:48.276 [39895:c07] [MPAVController]自动播放:跳过自动播放,禁用(当前项目:0,播放器:1)
 2012-09-26 15:24:48.286 [39895:c07] [MPCloudAssetDownloadController]为媒体项目ID请求优先级:0
 2012-09-26 15:24:48.938 [39895:c07] [MPAVController]自动播放:启用自动播放
 2012-09-26 15:24:48.940 [39895:c07] [MPAVController]自动播放:启用自动播放
 2012-09-26 15:24:48.954 [39895:c07] [MPAVController]自动播放:跳过自动播放,禁用(对于当前项目:0,播放器:1)
 2012-09-26 15:24:49.006 [39895:c07] [MPAVController]自动播放:启用自动播放
 2012-09-26 15:24:49.012 [39895:c07] [MPAVController]自动播放:跳过自动播放,禁用(对于当前项目:0,播放器:1)

有人有一个想法,为什么玩家停止工作?

编辑: 在github上添加了一个示例项目

你正在viewWillDisappear:停止videoviewWillDisappear:viewDidDisappear: 当iOS 6上的video进入全屏时,这些方法会被调用,但是在任何早期的iOS版本中都不会调用这些方法(在Open Radar中为这个“bug” 提交了一个报告 )。 我发布了一个类似问题的临时解决scheme :

我的临时解决scheme,直到bug修复是检查玩家的fullscreen布尔值viewWillDisappear:和/或viewDidDisappear: 如果返回YES ,电影将进入全屏模式,您应该避免做任何可能会中断的操作。

我用不同的方法解决了这个问题。 由于问题的主要原因是iOS 6调用viewWillDisappear:和/或viewDidDisappear:方法。 我以为也许iOS也调用MPMoviePlayerViewController的相同方法。 所以我为MPMoviePlayerViewController创build了一个Category,并实现了viewWillDisappear:和/或viewDidDisappear:方法。 有趣的是,它的作品。 (顺便说一句,这不是由苹果推荐)

这里是代码;

标题(MPMoviePlayerViewController_FullscreenFix.h)

 #import <MediaPlayer/MediaPlayer.h> @interface MPMoviePlayerViewController (MPMoviePlayerViewController_FullscreenFix) - (void)viewDidDisappear:(BOOL)animated; - (void)viewWillDisappear:(BOOL)animated; @end 

实现(MPMoviePlayerViewController_FullscreenFix.m)

 #import "MPMoviePlayerViewController_FullscreenFix.h" @implementation MPMoviePlayerViewController (MPMoviePlayerViewController_FullscreenFix) -(void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } - (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; } @end 

现在我的代码在iOS 6.1.3,5.5.1和4.3.5版本上工作,具有完全相同的行为。

我自己解决了。 当我将Movie Player作为子视图添加到容器视图中时,我不需要使用通过MPMoviePlayerViewController创build的实际视图控制器,该控制器旨在用于以模态方式或在其他一些vc层次结构中呈现它。

对于具有可作为子视图添加到其他视图的Movie Player视图的单个目的, MPMoviePlayerController的视图属性就足够了。

直到iOS 6都工作,但iOS 6似乎在资源pipe理/生命周期方面有所不同。

示例项目更新了工作代码。

我有同样的问题,但从一个url加载video(在networking上)

以前我:

  1. 订阅了MPMoviePlayerPlaybackDidFinishNotification通知
  2. 初始化一个MPMoviePlayerViewController (在这个阶段没有内容url)
  3. 通过presentMoviePlayerViewControllerAnimated呈现:
  4. 当它在屏幕上时,我加载了stream式传输的URL(asynchronous)
  5. 当url返回时,我将在MPMoviePlayerViewController的moviePlayer上设置内容URL

正如你所说,偶尔MPMoviePlayerViewController会卡住,并不会退出当用户点击退出,解决这个问题,我改变了我的自动播放顺序,所以stream程变成:

  1. 订阅了MPMoviePlayerPlaybackDidFinishNotification通知
  2. 初始化一个MPMoviePlayerViewController (在这个阶段没有内容url)
  3. 将moviePlayer的shouldAutoplay布尔值设置为NO
  4. 通过presentMoviePlayerViewControllerAnimated呈现:
  5. 当它在屏幕上时,我加载了stream式传输的URL(asynchronous)
  6. 当url返回时,我将在MPMoviePlayerViewController的moviePlayer上设置内容URL
  7. 将moviePlayer的shouldAutoplay布尔值设置为YES

由于这两个变化,我还没有看到控制器卡住了

我在iOS 6上有类似的东西。

您是否尝试强制玩家进入全屏后播放? 通过再次调用[MPMoviePlayerController play] – 这部分解决了我的问题。

设置播放器的内容url后,请检查确切的url。 它可能包含一些非法字符。

  NSLog(@"%@", player.contentURL); 

模拟器删除空间,但设备没有。 这就是发生在我身上的事情。

解决scheme是创build一个属性来保留MPMoviePlayerController类

 @property (nonatomic, retain) MPMoviePlayerController *moviePlayerController; 

并在您的控制器中使用该属性

 self.moviePlayerController = [[MPMoviePlayerController alloc] init]; [_viewMediaPlayer addSubview:self.moviePlayerController.view]; 

在iOS6中有一个错误,当以全屏模式进入时,MPMoviePlayerController被解除分配http://openradar.appspot.com/12327997

所以对我来说这个解决scheme工作

 if( !( player.playbackState == MPMoviePlaybackStatePlaying ) ) { player.shouldAutoplay = YES; [player prepareToPlay]; [player stop]; [player play]; } 

添加“shouldAutoplay”和“stop”

问候,伊丽莎

只需将生成的URL添加shouldAutoplay布尔值为YES它为我工作。

喜欢这个:

 NSString *path = [[NSBundle mainBundle] pathForResource:videoFileName ofType:@"mp4" inDirectory:nil]; NSURL *movieURL = [NSURL fileURLWithPath:path]; MPMoviePlayerController *player = [[MPMoviePlayerController alloc] init]; player.contentURL = movieURL; player.controlStyle = MPMovieControlStyleNone; player.shouldAutoplay = YES; [player prepareToPlay]; player.fullscreen = YES; [player.view setFrame:[[[[UIApplication sharedApplication] delegate] window] frame]]; // player's frame must match parent's [[[[UIApplication sharedApplication] delegate] window] addSubview: player.view]; [player play]; 

处理这个问题的另一种方法是使用全屏通知callback:

1)添加电影播放器​​MPMoviePlayerDidEnterFullscreenNotification的通知。 2)在播放电影之前,设置一个布尔值,指示电影正在进入全屏。 3)清除全屏callback中布尔值为NO,以及您的电影完成callback。 4)在你的viewWillDisappear中,检查你的布尔值,看看你的电影是否进入全屏,并根据需要进行处理。

此外,当呈现MPMoviePlayerViewController时,在呈现之后使用setFullScreen函数可以导致电影在iOS6上停止。

我的工作解决scheme:

我有同样的问题,当我试图播放video时,一秒钟后立即停止日志:

 [MPCloudAssetDownloadController] Prioritization requested for media item ID: 0 [MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1) 

我在播放命令之前解决停止命令:

 [playerController stop]; [playerController play]; 

现在它工作完美!