我在MPMoviewPlayerViewController
对象中嵌入了UIView
。当我在嵌入模式下启动播放器时,一切正常并且符合预期。如果用户然后点击全屏切换(或者如果我使用setFullscreen:animated
以编程方式更改为全屏),则播放器全屏播放,电影播放另一秒钟,之后屏幕变黑,只有“正在加载...... “消息。
此行为仅在使用iOS 6(也称为iPad 6.0模拟器)时出现,在运行iOS 5的设备上,一切都按预期工作。
电影来源是应用包中的本地文件。
播放时进入全屏调试输出如下:
2012-09-26 15:24:48.251 [39895:c07] [MPAVController] Autoplay: Disabling autoplay for pause 2012-09-26 15:24:48.252 [39895:c07] [MPAVController] Autoplay: Disabling autoplay 2012-09-26 15:24:48.262 [39895:c07] [MPAVController] Autoplay: Enabling autoplay 2012-09-26 15:24:48.265 [39895:c07] [MPAVController] Autoplay: Likely to keep up or full buffer: 0 2012-09-26 15:24:48.266 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, not enough buffered to keep up. 2012-09-26 15:24:48.267 [39895:c07] [MPAVController] Autoplay: Likely to keep up or full buffer: 0 2012-09-26 15:24:48.268 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, not enough buffered to keep up. 2012-09-26 15:24:48.276 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1) 2012-09-26 15:24:48.286 [39895:c07] [MPCloudAssetDownloadController] Prioritization requested for media item ID: 0 2012-09-26 15:24:48.938 [39895:c07] [MPAVController] Autoplay: Enabling autoplay 2012-09-26 15:24:48.940 [39895:c07] [MPAVController] Autoplay: Enabling autoplay 2012-09-26 15:24:48.954 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1) 2012-09-26 15:24:49.006 [39895:c07] [MPAVController] Autoplay: Enabling autoplay 2012-09-26 15:24:49.012 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1)
有人知道为什么玩家会停止工作吗?
答案 0 :(得分:45)
您是否在viewWillDisappear:
或viewDidDisappear:
停止了视频?当视频在iOS 6上进入全屏时会调用这些方法,但在任何早期iOS版本上都不会调用这些方法(在Open Radar中report has been filed为此“bug”)。我在类似的问题上发布了this temporary solution:
在修复错误之前,我的临时解决方案是检查fullscreen
和/或viewWillDisappear:
中玩家的viewDidDisappear:
布尔值。如果它返回YES
,则电影正在进入全屏模式,您应该避免做任何可能会中断它的事情。
答案 1 :(得分:8)
我用不同的方法解决了这个问题。由于问题的主要原因是iOS 6调用viewWillDisappear:和/或viewDidDisappear:方法。我想也许iOS也调用了MPMoviePlayerViewController的相同方法。所以我为MPMoviePlayerViewController创建了一个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版本,但行为完全相同。
答案 2 :(得分:3)
我自己解决了。当我将Movie Player作为子视图添加到容器视图时,我不需要使用用MPMoviePlayerViewController
创建的实际视图控制器,该控制器旨在用于以模态方式或在其他vc层次结构中呈现它。 / p>
为了让电影播放器视图可以作为子视图添加到其他视图的单一目的,MPMoviePlayerController
的视图属性就足够了。
直到iOS 6都有效,但iOS 6在资源管理/生命周期方面似乎有所不同。
示例项目使用工作代码进行更新。
答案 3 :(得分:2)
我遇到了同样的问题,但是从网址加载了一个视频(在网络上)
以前我:
MPMoviePlayerPlaybackDidFinishNotification
次通知MPMoviePlayerViewController
(此阶段没有内容网址)presentMoviePlayerViewControllerAnimated
:MPMoviePlayerViewController
'moviePlayer上设置内容网址正如你所说,偶尔MPMoviePlayerViewController
会卡住并且当用户点击退出时不会解散,为了解决这个问题,我改变了我的自动播放顺序,所以流程变成了:
MPMoviePlayerPlaybackDidFinishNotification
次通知MPMoviePlayerViewController
(此阶段没有内容网址)shouldAutoplay
布尔值设置为NO presentMoviePlayerViewControllerAnimated
:MPMoviePlayerViewController
'moviePlayer上设置内容网址shouldAutoplay
布尔值设置为YES 由于这两项更改,我还没有看到控制器卡住
答案 4 :(得分:1)
我在iOS 6上有类似的东西。
您是否尝试过全屏后强制播放器播放?例如,再次调用[MPMoviePlayerController play]
- 这部分解决了我遇到的问题。
答案 5 :(得分:1)
设置播放器的内容网址后,请检查确切的网址。它可能包含一些非法字符。
NSLog(@"%@", player.contentURL);
模拟器删除空格但设备没有。这就是发生在我身上的事。
答案 6 :(得分:1)
解决方案是创建一个属性来保留MPMoviePlayerController类
@property (nonatomic, retain) MPMoviePlayerController *moviePlayerController;
并使用控制器中的属性
self.moviePlayerController = [[MPMoviePlayerController alloc] init];
[_viewMediaPlayer addSubview:self.moviePlayerController.view];
iOS6中存在错误,当以全屏模式进入时,会释放MPMoviePlayerController http://openradar.appspot.com/12327997
答案 7 :(得分:1)
所以对我来说这个解决方案有效:
if( !( player.playbackState == MPMoviePlaybackStatePlaying ) ) {
player.shouldAutoplay = YES;
[player prepareToPlay];
[player stop];
[player play];
}
同时添加“shouldAutoplay”和“stop”
此致 伊丽莎
答案 8 :(得分:0)
添加 shouldAutoplay布尔值为YES 生成URL后 它对我有用。
像这样: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];
答案 9 :(得分:0)
另一种处理方法是使用全屏通知回调:
1)为电影播放器MPMoviePlayerDidEnterFullscreenNotification添加通知。 2)在播放电影之前,设置一个布尔值,表示电影正在进入全屏。 3)在全屏幕回调以及电影完成回叫中将布尔值清除为NO。 4)在你的viewWillDisappear中,检查你的布尔值,看看你的电影是否进入全屏,并根据需要进行处理。
同样在展示MPMoviePlayerViewController时,在演示后使用setFullScreen函数会导致影片在iOS6上停止。
答案 10 :(得分:0)
我的工作解决方案:
我有同样的问题,当我尝试播放视频时,它会在一秒钟之后立即停止并显示日志:
[MPCloudAssetDownloadController] Prioritization requested for media item ID: 0
[MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1)
我解决在播放命令之前发出停止命令:
[playerController stop];
[playerController play];
现在它完美无缺!