6

我正在尝试在 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) 并跟踪访问日志。单击播放按钮时,会出现通常的黑色窗口。服务器端我在日志中发现了两个新条目:

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, 10, 300, 220);
[self.view addSubview:mpController.view];
[mpController play];
4

2 回答 2

12

正如我对MPMoviePlayerController 播放在视频结束之前终止的回答一样,这看起来是一个内存管理(实例生命周期)问题。假设您正在使用 ARC 进行编译,则该变量会在您的方法返回player时被释放。playButtonClicked:此时MPMoviePlayerController个体拿起球棒和球回家。

尝试将MPMoviePlayerController实例分配给强实例变量或属性。

于 2012-07-07T15:13:14.980 回答
1

在我看来,没有什么明显不合适的。以下是一些有助于缩小问题范围的调试技巧:

  • 尝试使用通过 http 提供的 mp4 文件的 URL——这应该告诉您这是 UI 问题还是资产问题。
  • 尝试检查url文件长度等属性并确认它与您的期望完全匹配。
于 2012-07-06T16:23:25.360 回答