我正在尝试在iOS应用程序中播放视频,使用MPMoviePlayerController在用户按下按钮时将电影视图附加到现有视图.
视图在右侧位置显示为黑框,但没有任何反应.
我期待电影开始播放,但没有任何事情发生,也没有提示应用程序的原因.
视图在右侧位置显示为黑框,但没有任何反应.
我期待电影开始播放,但没有任何事情发生,也没有提示应用程序的原因.
任何人都可以看到这出错的地方?
-(IBAction) playButtonClicked:(id)sender { NSString* path = [[NSBundle mainBundle] pathForResource:@"sample_mpeg4" ofType:@"mp4"]; NSLog(@"Using videoPath %@",path); NSURL* url = [NSURL fileURLWithPath:path]; MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url]; [self.view addSubview:player.view]; player.view.frame = CGRectMake(10,10,300,220); [player play];
}
电影存在并记录正确的路径,但仍然没有电影播放.
2012-07-06 11:51:13.492 experiments[84702:12203] Using videoPath /Users/marius/Library/Application Support/iPhone Simulator/5.1/Applications/9799C851-8D2B-4CFE-8CFA-A4C4C954787F/experiments.app/sample_mpeg4.mp4
根据我的阅读和理解,这应该是有效的.
关于尝试什么的任何提示或建议?
我将电影移动到HTTP服务器(fg.mp4)并拖尾访问日志.
单击播放按钮时,会出现通常的黑色窗口.
Serverside我在日志中找到两个新条目:
168.122.x.x - - [06/Jul/2012:22:42:33 +0200] "GET /fg.mp4 HTTP/1.1" 304 192 "-" "AppleCoreMedia/1.0.0.9B176 (iPhone Simulator; U; cpu OS 5_1 like Mac OS X; en_us)" 168.122.x.x - - [06/Jul/2012:22:42:33 +0200] "GET /fg.mp4 HTTP/1.1" 206 33304 "-" "AppleCoreMedia/1.0.0.9B176 (iPhone Simulator; U; cpu OS 5_1 like Mac OS X; en_us)"
因此,手机可以获取部分电影内容,并且 – 显然 – 准备在需要时完成其余部分.
我错过了MPMoviePlayerController有一些明显的参数吗?
问题是由ARC引起的,并且在调用设置控制器的方法后没有保留对MPMoviePlayerController的引用.
解决方案:在类中添加一个类变量,并使用它在电影的生命周期内保持对控制器的引用.
所以在类声明的早期(在任何消息/函数定义之外):
MPMoviePlayerController* mpController;
并且提到的playButtonClicked使用此变量来跟踪控制器:
NSString* path = [[NSBundle mainBundle] pathForResource:@"sample_mpeg4" ofType:@"mp4"]; NSURL* url = [NSURL fileURLWithPath:path]; mpController = [[MPMoviePlayerController alloc] initWithContentURL:url]; mpController.view.frame = CGRectMake(10,220); [self.view addSubview:mpController.view]; [mpController play];
解决方法
与我对
MPMoviePlayerController playback terminates before video finishes的回答一样,这看起来像是内存管理(实例生命周期)问题.假设您正在使用ARC进行编译,那么当您的playButtonClicked:方法返回时,播放器变量将被释放.此时,MPMoviePlayerController实例接受其蝙蝠和球,然后回家.
尝试将MPMoviePlayerController实例分配给强实例变量或属性.