MPMoviePlayerController显示黑色空屏幕

时间:2011-12-08 10:44:06

标签: ios objective-c video mpmovieplayercontroller

我使用MPMoviePlayerController在我的Application Document文件夹中播放本地文件,该文件已经下载了服务器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无法使用。 但是如果下次播放相同的本地文件,它可以正常播放。 我甚至验证了playState& localState MPMoviePlayerController他们似乎很好。 黑色空屏可能是什么原因?

13 个答案:

答案 0 :(得分:31)

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

答案 1 :(得分:15)

您可以尝试[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]

答案 2 :(得分:13)

我通过放

来解决这个问题
@property (strong, nonatomic) MPMoviePlayerController *moviePlayer; 

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

答案 3 :(得分:7)

您需要使用MPMoviePlayerViewController。注意那里的“视图”一词。

答案 4 :(得分:3)

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

 -(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");

}

答案 5 :(得分:2)

同样的事发生在我身上。事实证明,我曾试图播放电影而UIImagePicker尚未被解雇。

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

MPMediaPlayerController

答案 6 :(得分:2)

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

答案 7 :(得分:1)

这是我用来播放网址文件的代码:

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

它对我来说似乎很好。两个注意事项:

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

答案 8 :(得分:0)

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

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

  

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

答案 9 :(得分:0)

将设备iOS更新为5.0后,此问题似乎已修复 似乎以前版本的iOS SDK问题

答案 10 :(得分:0)

你必须在完成的回调中使用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];

}

答案 11 :(得分:0)

我遇到了类似的问题。播放后会出现一个空屏幕,这会阻止我再次播放视频。 那么这是我的工作。这样播放按钮不会消失。

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

答案 12 :(得分:0)

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

添加以下代码:

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

<强>这里:

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