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

时间:2012-09-26 13:29:48

标签: ios mpmovieplayercontroller fullscreen ios6

我在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)

有人知道为什么玩家会停止工作吗?

修改 添加了example project on github

11 个答案:

答案 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)

我遇到了同样的问题,但是从网址加载了一个视频(在网络上)

以前我:

  1. 订阅了MPMoviePlayerPlaybackDidFinishNotification次通知
  2. 初始化MPMoviePlayerViewController(此阶段没有内容网址)
  3. 通过presentMoviePlayerViewControllerAnimated
  4. 提出
  5. 当它出现在屏幕上时,我加载了流式网址(异步)
  6. 当网址回来时,我会在MPMoviePlayerViewController'moviePlayer上设置内容网址
  7. 正如你所说,偶尔MPMoviePlayerViewController会卡住并且当用户点击退出时不会解散,为了解决这个问题,我改变了我的自动播放顺序,所以流程变成了:

    1. 订阅了MPMoviePlayerPlaybackDidFinishNotification次通知
    2. 初始化MPMoviePlayerViewController(此阶段没有内容网址)
    3. 将moviePlayer的shouldAutoplay布尔值设置为NO
    4. 通过presentMoviePlayerViewControllerAnimated
    5. 提出
    6. 当它出现在屏幕上时,我加载了流式网址(异步)
    7. 当网址回来时,我会在MPMoviePlayerViewController'moviePlayer上设置内容网址
    8. 将moviePlayer的shouldAutoplay布尔值设置为YES
    9. 由于这两项更改,我还没有看到控制器卡住

答案 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];

现在它完美无缺!