【问题标题】:MPMoviePlayerController showing black empty screenMPMoviePlayerController 显示黑屏
【发布时间】:2012-01-15 19:31:23
【问题描述】:

我使用MPMoviePlayerController 在我的应用程序文档文件夹中播放本地文件,该文件已下载用于服务器 URL:

itemMoviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];
 [self.view addSubview:itemMoviePlayerController.view];
 itemMoviePlayerController.fullscreen = YES;
 itemMoviePlayerController.movieSourceType = MPMovieSourceTypeFile;
 itemMoviePlayerController.initialPlaybackTime = -1.0;
 [itemMoviePlayerController play];

当我刚下载 .mov 文件后播放它时,它显示一个黑色的空白屏幕并且应用程序 UI 无法使用。 但是如果下次播放相同的本地文件,它就可以正常播放。 我什至为MPMoviePlayerController 验证了playState 和localState,它们看起来还不错。 黑屏可能是什么原因?

【问题讨论】:

  • 2013 年 12 月 .. 提示 - 文件扩展名(来自网络的文件)非常古怪。在我的应用程序中,.MOV 有效,.mov 使 iPhone 严重崩溃。奇怪。模拟器也根本不起作用,它完全没用,只会崩溃。最后,在 MPMoviePlayerViewController 方法有效时,MPMoviePlayerController 无用且损坏。最后,您不能同时在屏幕上显示多个 - 它们都会变黑并失败。
  • 这看起来和我的问题一模一样。

标签: ios objective-c video mpmovieplayercontroller


【解决方案1】:

您需要改用 MPMoviePlayerViewController。请注意其中的“视图”一词。

【讨论】:

  • 我什至尝试过使用 MPMoviePlayerViewController 但这也会导致同样的黑屏
  • 这个答案毫无意义。为什么电影播放器​​的视图控制器变体在内容的预缓冲和识别方面应该有所不同。
  • 不应该。然而,一个常见的错误是使用 MPMoviePlayerController(没有“视图”),从 iOS 4 开始,它只会给你一个空白屏幕(因为它的视图没有添加到任何地方)。因此,许多旧示例不再有效。原来不是这个人的问题,但是“黑空屏”往往是这个API变化的结果。
  • 帮助了我。似乎 MPMoviePlayerViewController 处理更多错误并在发生任何不良情况时调用 MPMoviePlayerPlaybackDidFinishNotification 。这样,您可以在更容易发生不好的事情时关闭电影播放器​​。
【解决方案2】:

您可以尝试输入[itemMoviePlayerController prepareToPlay]; 在[itemMoviePlayerController play];之前

Apple 首选的仅显示全屏视频的方式是呈现模态 MPMoviePlayerViewController(正如 Hollance 所说)。 要呈现它,你应该使用类似的东西:

 moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:fileURL];
 [self presentMoviePlayerViewControllerAnimated:moviePlayerViewController];
 [itemMoviePlayerController play];

这是documented by Apple here

您可以在那里阅读,您应该保留对您的 MPMoviePlayerViewController 的引用,以便稍后将其关闭

[self dismissMoviePlayerViewControllerAnimated:moviePlayerViewController].

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,将正在播放的文件的扩展名从 .mpg 更改为 .mp4 解决了。显然 MPMoviePlayerController 需要一个正确的扩展,尽管从文档中我不清楚这是一个要求:

    http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html

    支持的格式 此类播放任何支持的电影或音频文件 在 iOS 中。这包括流式内容和固定长度文件。 对于电影文件,这通常意味着扩展名为 .mov 的文件, .mp4、.mpv 和 .3gp 并使用以下压缩方式之一 标准:

    【讨论】:

      【解决方案4】:

      同样的事情发生在我身上。事实证明,我曾尝试在 UIImagePicker 尚未关闭时播放电影。

      在我的UIImagePickerDelegate 中,我必须首先关闭UIImagePicker 弹出窗口,然后打开ViewController 管理MPMediaPlayerController:

      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)infoDict
      {
          //the first thing to do: dismiss the media picker
          if ([ipPop isPopoverVisible])
          {
              [ipPop dismissPopoverAnimated:ANIMATION_SETTING];
          }
      
          myMediaPlayerViewController * playerVC = [[myMediaPlayerViewController alloc] initWithMediaDict:infoDict];
          [self.navigationController pushViewController:playerVC animated:ANIMATION_SETTING];
      }
      

      【讨论】:

        【解决方案5】:

        这是我用来从 URL 播放文件的代码:

        MPMoviePlayerViewController *movieViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:contentUrl]];
        movieViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
        [self presentMoviePlayerViewControllerAnimated:movieViewController];
        [movieViewController release];
        

        这对我来说似乎工作得很好。两个注意事项:

        • 某些模拟器(如当前的 iOS 5.0)在播放电影时会崩溃,但它可以在真实设备上运行
        • 如果您省略 movieSourceType 部分,则会在电影开始前显示大约一秒钟的黑屏

        【讨论】:

          【解决方案6】:

          在将设备 iOS 更新到 5.0 后,此问题似乎已解决。
          似乎是以前版本的 iOS SDK 问题

          【讨论】:

            【解决方案7】:

            我也遇到了同样的问题,这让我发疯了。它可以在一个视图控制器上正常工作(音频和视频),但不能在另一个视图控制器上工作(只有音频的黑屏)。最后,我所做的只是改变调用的顺序:我只是等到我完成了电影播放器​​的配置,然后再将它添加到视图中。换句话说,我在调用“play”之前就调用了“addSubview”。

            【讨论】:

              【解决方案8】:

              您需要保留 MPMoviePlayerController 的实例,即作为属性或实例变量。如果您不保留对电影播放器​​的引用,它就会丢失。

              【讨论】:

              • 这就是我的解决方案。不管你的项目是不是ARC,你仍然需要保留MPMoviePlayerController的实例,否则它被释放了,电影就不起作用了。
              • 感谢这解决了我在完全相同的上下文中寻找了很长时间的错误;在 UITableViewCell 中显示电影。
              • 这只是......完美......!!!浪费了几个小时才找到这个!很好的答案!!!
              • 我已经使用了 MPMoviePlayerViewController 并展示了它,但是在加载视频时出现黑屏
              • 我不敢相信答案这么简单。
              【解决方案9】:

              您必须在完成的回调中使用 CGRectMake(0, 0, 0, 0) 这样做!

              -(void)playMovieAtURL:(NSURL*)theURL
              
              {
                  MPMoviePlayerController* theMovie=[[MPMoviePlayerController alloc] initWithContentURL:theURL];
                  theMovie.scalingMode=MPMovieScalingModeAspectFill;
              
                  theMovie.view.frame = CGRectMake(2, 246, 317, 70);
                  [self.view addSubview:theMovie.view];
              
                  // Register for the playback finished notification. 
              
                  [[NSNotificationCenter defaultCenter] addObserver:self 
                                                           selector:@selector(myMovieFinishedCallback:) 
                                                               name:MPMoviePlayerPlaybackDidFinishNotification 
                                                             object:theMovie];
              
                  // Movie playback is asynchronous, so this method returns immediately. 
                  [theMovie play];
              } 
              
              // When the movie is done,release the controller. 
              -(void)myMovieFinishedCallback:(NSNotification*)aNotification 
              {
                  MPMoviePlayerController* theMovie=[aNotification object]; 
                  [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                                  name:MPMoviePlayerPlaybackDidFinishNotification 
                                                                object:theMovie];
              
                  theMovie.view.frame = CGRectMake(0, 0, 0, 0);
                  // Release the movie instance created in playMovieAtURL
                  [theMovie release];
              
              }
              

              【讨论】:

                【解决方案10】:

                我遇到了类似的问题。播放后出现一个空白屏幕,这使我无法再次播放视频。 好吧,这是我的工作。这样播放按钮就不会消失。

                [self.movieController stop]; 
                [self.movieController prepareToPlay];
                [self.movieController pause];
                

                【讨论】:

                  【解决方案11】:

                  我希望这会有所帮助。我在我的项目中解决了这个问题

                   -(void)startPlayingMovie
                  {
                      NSLog(@"startPlayingMovie");
                      NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                                           pathForResource:@"Start_video" ofType:@"mov"]];
                      moviePlayer =  [[MPMoviePlayerViewController alloc]
                                      initWithContentURL:url];
                      moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.width);
                      [[NSNotificationCenter defaultCenter] addObserver:self
                                                               selector:@selector(moviePlayBackDidFinish:)
                                                                   name:MPMoviePlayerPlaybackDidFinishNotification
                                                                 object:moviePlayer.moviePlayer];
                  
                  moviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone;
                  moviePlayer.moviePlayer.shouldAutoplay = YES;
                  [self presentMoviePlayerViewControllerAnimated:moviePlayer];
                  [moviePlayer.moviePlayer setFullscreen:YES animated:NO];
                  
                  NSLog(@"endPlayingMovie");
                  
                  }
                  

                  【讨论】:

                  • moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.width); => moviePlayer.view.frame = self.view.bounds;
                  • 不是,因为高度和宽度是相反的
                  【解决方案12】:

                  我解决了这个问题

                  @property (strong, nonatomic) MPMoviePlayerController *moviePlayer; 
                  

                  在我的 .h 文件中,并在我的所有代码中调用 self.moviePlayer 并且它有效!

                  【讨论】:

                  • 不知道为什么会这样,但其他人都知道,确实如此。
                  • 它是 strong 属性使其因某种原因而工作
                  • 那是保留电影播放器​​。如果您只是在另一个视图控制器中使用它的视图,那么这也是玩家需要保持在身边的唯一提示。
                  • #import
                  【解决方案13】:

                  另外,如果您使用的是 http URL,请确保在您的项目 *.plist 文件中禁用 App Transport Security。它也会导致黑屏。

                  添加以下代码:

                  <key>NSAppTransportSecurity</key>
                  <dict>
                  <key>NSAllowsArbitraryLoads</key><true/>
                  </dict>
                  

                  这里:

                     [INSERT CODE ABOVE HERE]
                    </dict>
                  </plist>
                  ----- BOTTOM OF PLIST FILE
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-11-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-12-02
                    • 2011-01-11
                    • 2020-09-18
                    相关资源
                    最近更新 更多