26

我有一个MPMoviewPlayerViewController嵌入到一个UIView对象中。当我在嵌入式模式下启动播放器时,一切正常并按预期工作。如果用户然后点击全屏切换(或者如果我以编程方式更改为全屏使用setFullscreen:animated),播放器将进入全屏状态,电影会再播放一秒钟,然后屏幕变黑,只有“正在加载... ”消息。

此行为仅在使用 iOS 6(也是 iPad 6.0 模拟器)时出现,在运行 iOS 5 的设备上一切正常。

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

播放并进入全屏后,调试输出如下:

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 上 添加了一个示例项目

4

11 回答 11

45

您是在viewWillDisappear:或中停止视频viewDidDisappear:吗?当视频在 iOS 6 上进入全屏模式时,这些方法会被调用,但在任何早期的 iO​​S 版本上都不会调用(Open Radar 已针对此“错误”提交了一份报告)。我在类似的问题上发布了这个临时解决方案:

在修复错误之前,我的临时解决方案是在和/或中检查玩家的fullscreen布尔值。如果它返回,则电影正在进入全屏模式,您应该避免做任何可能打断它的事情。viewWillDisappear:viewDidDisappear:YES

于 2012-09-26T19:34:11.133 回答
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 版本上都可以使用,并且行为完全相同。

于 2013-03-23T20:26:29.403 回答
3

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

对于拥有可以作为子视图添加到其他视图的电影播放器​​视图的单一目的,MPMoviePlayerController的 view 属性就足够了。

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

示例项目已使用工作代码进行更新。

于 2012-09-28T08:52:17.667 回答
2

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

以前我:

  1. 订阅MPMoviePlayerPlaybackDidFinishNotification通知
  2. 初始化了一个MPMoviePlayerViewController(这个阶段没有内容的url)
  3. 通过以下方式呈现presentMoviePlayerViewControllerAnimated
  4. 当它出现在屏幕上时,我加载了流式 url(异步)
  5. 当 url 返回时,我会在MPMoviePlayerViewController'moviePlayer上设置内容 url

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

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

由于这两个更改,我还没有看到控制器卡住

于 2012-09-27T03:17:37.580 回答
1

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

您是否尝试过在全屏后强制播放器播放?例如,通过再次调用[MPMoviePlayerController play]- 这部分解决了我遇到的问题。

于 2012-09-26T14:42:23.933 回答
1

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

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

模拟器会删除空格,但设备不会。这就是发生在我身上的事。

于 2012-10-08T21:40:59.583 回答
1

解决方案是创建一个属性来保留 MPMoviePlayerController 类

@property (nonatomic, retain) MPMoviePlayerController *moviePlayerController;

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

self.moviePlayerController = [[MPMoviePlayerController alloc] init];

[_viewMediaPlayer addSubview:self.moviePlayerController.view];

iOS6 中有一个错误,当进入全屏模式时,MPMoviePlayerController 被释放http://openradar.appspot.com/12327997

于 2013-03-15T19:05:14.153 回答
1

所以对我来说这个解决方案有效:

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

添加“shouldAutoplay”和“stop”

问候, 伊丽莎

于 2014-01-27T10:59:53.630 回答
0

只需在生成 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];
于 2012-09-27T08:08:34.047 回答
0

另一种处理方式是使用全屏通知回调:

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

此外,在呈现 MPMoviePlayerViewController 时,在呈现后使用 setFullScreen 函数可能会导致影片在 iOS6 上停止。

于 2012-12-23T12:55:53.267 回答
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];

现在它完美无缺!

于 2013-03-21T04:54:41.157 回答