【问题标题】:MPMoviePlayerController breaks/stops after going to fullscreen in iOS6在 iOS6 中进入全屏模式后 MPMoviePlayerController 中断/停止
【发布时间】:2012-09-18 03:33:13
【问题描述】:

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

此行为仅在使用 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)

有人知道播放器停止工作的原因吗?

编辑: 添加了example project on github

【问题讨论】:

    标签: ios mpmovieplayercontroller fullscreen ios6


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我已经这样做了。我什至尝试先将播放器发送到全屏,然后再开始播放。结果相同。
    【解决方案2】:

    您要停止viewWillDisappear:viewDidDisappear: 中的视频吗?当视频在 iOS 6 上进入全屏模式时会调用这些方法,但不会在任何早期的 iO​​S 版本上调用(在 Open Radar 上的 report has been filed 表示此“错误”)。我在类似的问题上发布了this temporary solution

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

    【讨论】:

    • 不,我什至还没有实现这些方法。我将尝试提出一个显示相同行为的最小示例项目。
    • 示例项目现在链接在原始问题中。
    • 虽然你@snod 可能没有实现这些方法,但它在层次结构中的根视图控制器上调用它们,并且默认实现是做一些清理或杀死电影播放器​​的事情。 Apple 可能会修复这个错误,但猫已经出局了,我们将不得不为那些不从 6.0 升级的人永远解决这个问题。
    • 很好的解决方案,@Anthony。谢谢!
    • 这里我必须写什么代码才能用这种方法恢复我的视频:viewWillDisappear: 和/或 viewDidDisappear:
    【解决方案3】:

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

    以前的我:

    1. 订阅MPMoviePlayerPlaybackDidFinishNotification 通知
    2. 初始化了MPMoviePlayerViewController(此阶段无内容网址)
    3. 通过presentMoviePlayerViewControllerAnimated提交:
    4. 当它出现在屏幕上时,我加载了流式传输的 url(异步)
    5. 当url回来后,我会在MPMoviePlayerViewController'moviePlayer上设置内容url

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

    1. 订阅MPMoviePlayerPlaybackDidFinishNotification 通知
    2. 初始化了一个MPMoviePlayerViewController(此阶段没有内容网址)
    3. 将moviePlayer的shouldAutoplay布尔值设置为NO
    4. 通过presentMoviePlayerViewControllerAnimated提交:
    5. 当它出现在屏幕上时,我加载了流式传输的 url(异步)
    6. 当url回来后,我会在MPMoviePlayerViewController'moviePlayer上设置内容url
    7. 将moviePlayer的shouldAutoplay布尔值设置为YES

    自从这两个更改以来,我还没有看到控制器卡住

    【讨论】:

    • 因为我从一开始就没有将电影播放器​​用作全屏,而是嵌入了可以切换到全屏的用户,因此您的解决方案/呈现 vc 的方式不适用于我: (这也不是偶尔发生,而是每次都发生。
    【解决方案4】:

    只需添加 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];
    

    【讨论】:

    • @VikasSRajput “被打脸”?那是什么意思? “Iska matlab kya hai?”
    • 这个答案完全是浪费时间
    【解决方案5】:

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

    为了让电影播放器​​视图可以作为子视图添加到其他视图,MPMoviePlayerController 的视图属性就足够了。

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

    示例项目已更新为工作代码。

    【讨论】:

    • 我在我的项目中使用了你的代码但它对我不起作用的问题..我在你的代码中使用的相同代码从 github 下载它可以工作!!!
    • 唯一的区别是内存管理..我使用著名的“保留”而不是“强...弱”
    • 我发现了我的问题:我捕捉到了所有异常......所以我的应用程序在首次亮相时崩溃
    • 好东西。实际上,使它起作用的不是容器视图,而是嵌入的样式。
    • hmmm ...我一直在使用MPMoviePlayerController,我一直看到锁定。
    【解决方案6】:

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

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

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

    【讨论】:

      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

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

        @property (nonatomic, retain) MPMoviePlayerController *moviePlayerController;
        

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

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

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

        【讨论】:

          【解决方案9】:

          我的工作解决方案:

          我遇到了同样的问题,当我尝试播放视频时,它会在一秒钟后立即停止并显示日志:

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

          解决了它把 stop 命令放在 play 命令之前:

          [playerController stop];
          [playerController play];
          

          现在完美了!

          【讨论】:

            【解决方案10】:

            我用不同的方法解决了这个问题。由于问题的主要原因是 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 版本上运行,并且行为完全相同。

            【讨论】:

              【解决方案11】:

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

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

              同时添加“shouldAutoplay”和“stop”

              问候, 伊丽莎

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-06-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多