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

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

4

4 回答 4

90

事实证明,我们所要做的就是:

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

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

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

  • 如果您想知道用户何时点击了完成按钮(播放器将自动关闭),您应该知道-viewDidAppear在播放器关闭时出现的视图控制器上调用了该按钮。您可以BOOL在玩家开始时设置一个变量并检查BOOL您的变量,-viewDidAppear以便您知道因为-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 时,URLWithString如果您想通过网络访问文件,请使用NSURL 的方法,如果您在本地fileUrlWithPath有文件,请使用 NSURL 的方法!

于 2012-10-18T09:06:21.253 回答
8

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

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];
于 2014-05-29T06:51:56.483 回答
2

尝试这个:

//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.
于 2014-01-24T12:00:52.990 回答
1

尝试添加

[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

于 2012-10-10T15:05:58.113 回答