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)
movieController是MPMoviePlayerViewController.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.movieplayer是的一个实例的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)