【问题标题】:MPMoviePlayerController not playing any video content [due to ARC and memory management]MPMoviePlayerController 不播放任何视频内容 [由于 ARC 和内存管理]
【发布时间】:2012-07-06 16:03:21
【问题描述】:

我正在尝试在 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];

【问题讨论】:

    标签: objective-c xcode mpmovieplayercontroller


    【解决方案1】:

    正如我对MPMoviePlayerController playback terminates before video finishes 的回答一样,这似乎是一个内存管理(实例生命周期)问题。假设您使用 ARC 进行编译,当您的 playButtonClicked: 方法返回时,player 变量将被释放。此时MPMoviePlayerController 实例拿起球棒和球回家。

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

    【讨论】:

    • 就是这样。谢谢你把这个放在这里。如果其他人遇到同样的问题,我将使用新代码更新我的问题以供将来参考
    • 我在上面坐了 2 个小时...谢谢!我创建了一个强大的属性,现在它可以工作了
    【解决方案2】:

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

    • 尝试使用指向通过 http 提供的 mp4 文件的 URL --- 这应该可以告诉您这是 UI 问题还是资产问题。
    • 尝试检查url 中的文件长度等属性,并确认它完全符合您的预期。

    【讨论】:

    • 因此,通过将文件移动到我的开发服务器并从这里访问它,我可以看到文件在视图加载时被访问(实际上是两次)。仍然没有迹象表明它真的想玩。我尝试了几个不同的文件,包括我知道以前在 iPhone 上播放过的文件。还是没有运气。
    • 那听起来像是 UI 问题。如果您直接在 viewDidLoad 上注入 MPMoviePlayerController 的视图(而不是等待点击),它是否有效?
    • 我即将离开几个小时,但我回来后肯定会检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多