iOS:如何使用MPMoviePlayerController

我创build了一个空白的项目(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中。 它在视图层次结构中。

我知道这个事实,电影文件本身不是问题,因为我从MPMoviePlayer上的苹果示例代码。 尽pipe我(似乎)尝试了样本中的所有内容,但我却无法让玩家去工作。

这里是另一个尝试,这次用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]; 

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

原来我们要做的就是这个:

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

  • 重要说明 :如果您想要通过networking访问文件,并使用NSURL的fileUrlWithPath如果您有本地文件),则在定义URL时使用NSURL的URLWithString方法!

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

  • 如果你想知道用户什么时候点击完成button (玩家将被自动解散),你应该知道在视图控制器上调用了-viewDidAppear-viewDidAppear是在玩家被解散时出现的。 你可以在玩家启动时设置一个BOOLvariables,并在你的-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; ),而不是一个简单的伊娃,因为有时它不工作,如果它是一个伊娃

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

  • 重要提示 :如上所述,如果您想要通过networking访问文件并且使用NSURL的fileUrlWithPath如果您有本地文件),则在定义URL时使用NSURL的URLWithString方法!

你得试试这个……

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

尝试添加

 [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

尝试这个:

 //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.