MPMoviePlayerController在iOS6中进入全屏后中断/停止
我有一个MPMoviewPlayerViewController
embedded到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上)
以前我:
- 订阅了
MPMoviePlayerPlaybackDidFinishNotification
通知 - 初始化一个
MPMoviePlayerViewController
(在这个阶段没有内容url) - 通过
presentMoviePlayerViewControllerAnimated
呈现: - 当它在屏幕上时,我加载了stream式传输的URL(asynchronous)
- 当url返回时,我将在
MPMoviePlayerViewController
的moviePlayer上设置内容URL
正如你所说,偶尔MPMoviePlayerViewController
会卡住,并不会退出当用户点击退出,解决这个问题,我改变了我的自动播放顺序,所以stream程变成:
- 订阅了
MPMoviePlayerPlaybackDidFinishNotification
通知 - 初始化一个
MPMoviePlayerViewController
(在这个阶段没有内容url) - 将moviePlayer的shouldAutoplay布尔值设置为NO
- 通过
presentMoviePlayerViewControllerAnimated
呈现: - 当它在屏幕上时,我加载了stream式传输的URL(asynchronous)
- 当url返回时,我将在
MPMoviePlayerViewController
的moviePlayer上设置内容URL - 将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];
现在它工作完美!