iOS:如何使用MPMoviePlayerController

Zol*_*tók 30 video objective-c mpmovieplayercontroller avfoundation ios

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

NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"Movie" ofType:@"m4v"];
MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]];
[self presentMoviePlayerViewControllerAnimated:playerController];
[playerController.moviePlayer play];
Run Code Online (Sandbox Code Playgroud)

当应用程序启动时,我得到的是一个白色屏幕,其中包含日志中的错误消息:

 <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!
Run Code Online (Sandbox Code Playgroud)

......以及一系列关于禁用自动播放的内容.我特别不理解视图不属于层次结构的一行,因为它是一个空白的"单视图应用程序"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];
Run Code Online (Sandbox Code Playgroud)

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

Zol*_*tók 89

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

NSURL *movieURL = [NSURL URLWithString:@"http://example.com/somefile.mp4"];
movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
[self presentMoviePlayerViewControllerAnimated:movieController];
[movieController.moviePlayer play];
Run Code Online (Sandbox Code Playgroud)
  • movieControllerMPMoviePlayerViewController.h文件中声明的实例.

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

  • [movieController.moviePlayer play] 不是必需的,如果你没有将自动播放设置为NO,播放器将启动,但我观察到如果你放入play它会更快开始.这可能只是巧合.

  • 如果您想知道用户何时点击完成按钮(播放器将自动被解除),您应该知道-viewDidAppear在播放器被解除时出现的视图控制器上调用了该按钮.您可以设置一个BOOL玩家开始时的变量并检查BOOL-viewDidAppear,让你知道,-viewDidAppear被称为becaouse球员被驳回.或者您可以注册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];
Run Code Online (Sandbox Code Playgroud)
  • self.movi​​eplayer是的一个实例的MPMoviePlayerController(未MPMoviePlayerViewController).根据我的经验,将它声明为属性(如此@property (strong, nonatomic) MPMoviePlayerController *moviePlayer;:)而不是简单的ivar是很重要的,因为有时它只是如果它是一个ivar就不起作用

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

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


小智 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];
Run Code Online (Sandbox Code Playgroud)