【问题标题】:iOS: How to use MPMoviePlayerControlleriOS:如何使用 MPMoviePlayerController
【发布时间】:2012-10-01 02:32:30
【问题描述】:

我创建了一个空白项目 (iOS) 并将其放在我的 viewDidLoad 中:

NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"Movie" ofType:@"m4v"];
MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]];
[self presentMoviePlayerViewControllerAnimated:playerController];
[playerController.moviePlayer play];

当应用启动时,我得到的只是一个白屏,日志中有错误消息

 <Error>: CGContextSaveGState: invalid context 0x0
 <Error>: CGContextClipToRect: invalid context 0x0
 <Error>: CGContextTranslateCTM: invalid context 0x0
 <Error>: CGContextDrawShading: invalid context 0x0
 <Error>: CGContextRestoreGState: invalid context 0x0
Warning: Attempt to present <MPMoviePlayerViewController: 0x821e3b0> on <ViewController: 0x863aa40> whose view is not in the window hierarchy!

...还有一堆关于禁用自动播放的语句。 我特别不明白视图不是层次结构的一部分,因为它是一个空白的“单视图应用程序”iOS项目,代码在 ViewController.m 中。它在视图层次结构中。

我知道电影文件本身不是问题,因为我是从 Apple 在 MPMoviePlayer 上的示例代码中获得的。尽管我(似乎)尝试了示例中编写的所有内容,但我就是无法让播放器工作。

这是另一个尝试,这次是 MPMoviePlayerController(不是 MPMoviePlayerViewController):

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
[player setContentURL:url];
[player setMovieSourceType:MPMovieSourceTypeFile];

[[player view] setFrame:self.view.bounds];
[player view].backgroundColor = [UIColor greenColor];

player.scalingMode = MPMovieScalingModeNone;
player.controlStyle = MPMovieControlModeDefault;
player.backgroundView.backgroundColor = [UIColor whiteColor];
player.repeatMode = MPMovieRepeatModeNone;

[self.view addSubview: [player view]];
[player play];

类似的结果,白屏和错误。 请帮忙....

【问题讨论】:

  • 尝试将其放入viewDidAppear
  • 将它放入 viewDidAppear 解决了上下文错误,谢谢,但我仍然没有得到播放器,只是一个白屏

标签: objective-c ios video mpmovieplayercontroller avfoundation


【解决方案1】:

原来我们所要做的就是:

NSURL *movieURL = [NSURL URLWithString:@"http://example.com/somefile.mp4"];
movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
[self presentMoviePlayerViewControllerAnimated:movieController];
[movieController.moviePlayer play];
  • movieController 是在 .h 文件中声明的 MPMoviePlayerViewController 的一个实例。

  • 重要提示:定义 URL 时,如果您想通过网络访问文件,请使用 NSURL 的 URLWithString 方法,如果您在本地有文件,请使用 NSURL 的 fileUrlWithPath! p>

  • [movieController.moviePlayer play] 不是必需的,无论您是否将自动播放设置为 NO,播放器都会启动,但我观察到,如果您将 play 放入其中,它会启动快一点。这可能只是巧合。

  • 如果您想知道用户何时点击完成按钮(播放器将自动关闭),您应该知道在出现的视图控制器上调用了-viewDidAppear球员被解雇。您可以在播放器启动时设置BOOL 变量并检查-viewDidAppear 中的BOOL,以便您知道调用-viewDidAppear 是因为播放器被解雇了。或者,您可以注册MPMoviePlayerDidExitFullScreen 通知,但这对我不起作用。

或者,如果这不起作用,您可以执行以下操作

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"something" ofType:@"mp4"]]];
[self.moviePlayer.view setFrame:CGRectMake(0, 0, 320, 320)];
[self.moviePlayer play];
[self.view addSubview:self.moviePlayer.view];
  • self.movi​​eplayer 是 MPMoviePlayerController 的一个实例(不是 MPMoviePlayerViewController)。根据我的经验,将其声明为属性(例如:@property (strong, nonatomic) MPMoviePlayerController *moviePlayer;)而不是简单的 ivar 很重要,因为有时如果它是 ivar,它就不起作用

  • 设置帧也很重要,因为如果我们不设置,视频根本就不会出现。框架可以是任何东西,只要您定义的内容在您的视图范围内

  • 重要提示:如上,在定义 URL 时,如果您想通过网络访问文件,请使用 NSURL 的 URLWithString 方法并使用 NSURL 的 @987654338 @如果您有本地文件!

【讨论】:

  • 我已经尝试过这段代码,当我像这样将它添加到子视图时,我只看到视频:[self.view addSubview:_movieController.view];但是由于某种原因,顶部的擦洗器比状态栏的正常位置低了几个像素。有没有办法纠正这个问题?我得到了这些错误,如这个问题所示。 stackoverflow.com/questions/12822420/…我做错了什么?
【解决方案2】:

你必须试试这个......

NSString *path = [[NSBundle mainBundle]pathForResource:@"test" ofType:@"mp4"];
    player = [[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL fileURLWithPath:path]];
    [player.view setFrame:CGRectMake(0, 0, 320, 320)];
    [self presentMoviePlayerViewControllerAnimated:player];
    [player.moviePlayer play];
     [self.view addSubview:player.view];

【讨论】:

    【解决方案3】:

    试试这个:

    //Hello guise :- complete process here.
    
    //1. add framework in .h 
    MediaPlayer/MediaPlayer.h
    
    //2.add delegate in @interface, MPMediaPickerControllerDelegate
    
    //3.@property (retain, nonatomic) MPMoviePlayerViewController *moviePlayerController;
    
    //4.and synthesize in .m - @synthesize moviePlayerController;
    
    //5.IN - tableViewdelegateMethod
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath{    
    
        //given path for song
        NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory1 = [paths1 objectAtIndex:0];
        NSString *strPath = [NSString stringWithFormat:@"%@/%@",documentsDirectory1,[movieArray objectAtIndex:indexPath.row]];
        NSLog(@"strPath %@",strPath);
        //path for song.
        //convert path in NSURL.
        NSURL *videosURL = [NSURL fileURLWithPath:strPath];
        moviePlayerController = [[MPMoviePlayerViewController alloc]initWithContentURL:videosURL];
        [self presentMoviePlayerViewControllerAnimated:moviePlayerController];
        [moviePlayerController.moviePlayer play];
    }
    
    //play song on UITableViewCell click.
    

    【讨论】:

    • 呃,movieArray 是什么?
    • fileURLWithPath 为我工作。它不适用于 urlWithString。谢谢
    【解决方案4】:

    尝试添加

    [player prepareToPlay];
    

    之后

    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
    

    您可以在 Apple 文档中阅读有关 MPMoviePlayerController 的更多信息: http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html#//apple_ref/doc/c_ref/MPMoviePlayerController

    【讨论】:

    • 这应该是评论,而不是答案。从您刚刚链接但显然尚未阅读的文档中:“如果在您调用 play 方法时电影播放器​​尚未准备好播放,则该方法会自动调用此方法”。所以这不可能是问题。问题是当前的 CoreGraphics 上下文是 NULL 在 OP 尝试启动播放时。
    • 即使使用您发布的文档中的示例(在顶部的概述部分中,我想有几行代码是使其工作的最少代码)它不起作用.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多