MPMoviePlayerController显示黑屏问题

25

我使用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文件时,会出现黑色空白屏幕,应用程序界面也无法使用。但是如果下一次播放同一本地文件,则可以正常播放。我甚至验证了MPMoviePlayerControllerplayStatelocalState,它们看起来很好。为什么会出现黑色空白屏幕呢?


1
2013年12月..提示 - 这个程序对于文件名扩展名(来自网络的文件)非常不稳定。在我的程序中,.MOV可以工作,.mov会导致iPhone崩溃,十分奇怪。此外模拟器根本不起作用,完全无用且容易崩溃。最后,采用MPMoviePlayerViewController方法可行,MPMoviePlayerController则无用且有问题。最后,你不能同时拥有多个屏幕上的播放器 - 它们都会变黑并失败。 - Fattie
这看起来和我的问题完全一样。 - RainCast
13个回答

31

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


这对我来说是解决方案。无论您的项目是否使用ARC,您仍然需要保留MPMoviePlayerController实例,否则它将被释放,电影将无法正常播放。 - Pablo
谢谢,这解决了我在很长时间内一直在追寻的一个错误,而且还是在完全相同的情境下;在 UITableViewCell 中展示电影。 - simonfi
这简直太完美了!!!我浪费了几个小时才找到这个答案!非常好的回答!!! - Dean Leitersdorf
我使用了MPMoviePlayerViewController并将其呈现,但在视频加载时出现了黑屏。 - PK86
我简直不敢相信答案会这么简单。 - An Chin

15

[itemMoviePlayerController play];之前,您可以尝试执行[itemMoviePlayerController prepareToPlay];

Apple推荐用模态MPMoviePlayerViewController来显示全屏视频(正如Hollance所说)。 要呈现它,您应该使用类似以下的东西:

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

这里由苹果记录下来了相关信息

您可以在那里阅读到,为了以后能够将其关闭,您应该保留对MPMoviePlayerViewController的引用,然后使用[self dismissMoviePlayerViewControllerAnimated:moviePlayerViewController]


13
我通过放置

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

我在.h文件中声明了self.moviePlayer,并在我的所有代码中调用它,然后它就起作用了!


2
不确定为什么这样做可以起作用,但其他人知道后也能用。 - Chris
strong 属性使其出于某种原因起作用。 - mattblessed
这是保留movieplayer的方法。如果您只是在另一个视图控制器中使用它的视图,则这是需要保留播放器的唯一提示。 - Kaolin Fire
#import <MediaPlayer/MediaPlayer.h> - Haseeb Javed

7
你需要使用MPMoviePlayerViewController。注意其中的“View”一词。

我甚至尝试使用MPMoviePlayerViewController,但它也会导致相同的黑色空白屏幕。 - Ritika
这个答案根本没有意义。为什么在预缓冲和内容识别方面,视图控制器变体的电影播放器会有任何不同呢? - Till
不应该出现这种情况。然而,一个常见的错误是使用MPMoviePlayerController(没有“View”),从iOS 4开始它只会给你一个空白屏幕(因为它的视图没有添加到任何地方)。因此,很多旧的例子不再起作用。虽然这并不是这个人的问题,但“黑色空白屏幕”经常是这个API变化的结果。 - Hollance
帮了我很大的忙。似乎MPMoviePlayerViewController处理更多的错误,并在发生任何问题时调用MPMoviePlayerPlaybackDidFinishNotification。这样,当出现问题时,您可以更轻松地关闭电影播放器。 - Lukasz

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

}

moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.width); => moviePlayer.view.frame = self.view.bounds; - kelin
这并不是因为高度和宽度被颠倒了。 - manecosta

2

我曾经遇到过类似的问题,让我很疯狂。在一个视图控制器上(音频和视频都正常),但在另一个视图控制器上却出现了黑屏只有音频的情况。最后,我所做的就是改变调用的顺序:在将电影播放器添加到视图之前,等到所有配置都完成。换句话说,在“播放”调用的前一行,我调用了“addSubview”。


2

我也遇到了同样的问题。原来是在UIImagePicker还没有关闭的情况下尝试播放电影。

在我的UIImagePickerDelegate中,我必须先关闭UIImagePicker弹出窗口,然后再打开管理MPMediaPlayerControllerViewController

- (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];
}

1

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

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

在我这里似乎工作得很好。两点需要注意:

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

0

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

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

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

0

更新设备 iOS 到 5.0 后,这个问题似乎已经解决。
之前版本似乎是 iOS SDK 的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接