我正在构建一个应用程序,其中包含一个带有电影链接的 XML 提要,我希望在用户单击图像时播放该电影。

为此,我使用 MPMoviePlayerViewController。到目前为止,在模拟器上测试该应用程序已经给了我预期的结果,但是,当我在 iPhone 上测试该应用程序时,播放器可以正常播放,但没有声音。

我在互联网上查看了一些文章,告诉我该应用程序的性能与模拟器为您提供的性能有很大不同。因此,我用 Instruments 进行了“泄漏”测试,它告诉我,每当我开始播放电影时,一些字节就会丢失或泄漏。难道这和声音突然减弱有关系吗?如果是这样,我该如何解决?

这是我第一次在 iPhone 上测试应用程序,所以看到应用程序的表现如此糟糕,我感到非常震惊。这是电影播放器​​部分的代码。

#pragma mark Video Controls
-(void)playVideo:(id)sender{
    moviePlaying=TRUE;
    MPMoviePlayerViewController *playerViewController;
    playerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[data objectForKey:@"[att]url"]]];


    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:[playerViewController moviePlayer]];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidExitFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[playerViewController moviePlayer]];
    MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] init] autorelease];
    player = [playerViewController moviePlayer];

    [self.view addSubview:playerViewController.view];
    player.controlStyle = MPMovieControlStyleDefault;
    player.shouldAutoplay = YES;
    [player setFullscreen:YES animated:YES];
} 

- (void)moviePlayBackDidExitFullscreen:(NSNotification*)notification{
    MPMoviePlayerViewController *moviePlayer = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];

    [moviePlayer.view removeFromSuperview];
    [moviePlayer release];
}
- (void)moviePlayBackDidFinish:(NSNotification*)notification {
    MPMoviePlayerViewController *moviePlayer = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];

    moviePlaying=FALSE;
    [moviePlayer.view removeFromSuperview];
    [moviePlayer release];
}
#pragma mark VideoControls End

我希望你能阐明这个问题。

提前致谢,

/布林克10

有帮助吗?

解决方案

你在这里遇到了一些非常严重的困惑。您不应同时创建 MPMoviePlayerViewController 和 MPMoviePlayerController。使用其中之一。这些行毫无意义:

MPMoviePlayerController *player = 
    [[[MPMoviePlayerController alloc] init] autorelease];
player = [playerViewController moviePlayer];

您正在创建一个 MPMoviePlayerController 并将其分配给播放器,但随后将其丢弃,将其替换为现有 MPMoviePlayerViewController 的 moviePlayer。

我们退后十码并弃踢吧。播放电影/流声音/任何内容的简单方法是使用 MPMoviePlayerViewController。它是一个视图控制器,因此只需将其推到要使用 UIViewController 的位置即可。最简单的是以模态方式显示它:

NSURL* m = // whatever;
MPMoviePlayerViewController* mpvc = 
    [[MPMoviePlayerViewController alloc] initWithContentURL: m];
[self presentModalViewController:mpvc animated:YES];
[mpvc release];

这将创建 MPMoviePlayerController 及其视图,并仅在全屏模式下为您呈现整个 shebang。简单又容易。当用户点击“完成”时,模式视图甚至会被关闭。

使用 MPMoviePlayerController 更复杂。它不是 UIViewController。但它有一个观点。如果您希望用户看到任何内容,您的工作就是抓取该视图,给它一个框架,然后将其粘贴到您的界面中:

NSURL* m = // whatever;
MPMoviePlayerController* mp = 
    [[MPMoviePlayerController alloc] initWithContentURL:m];
self.mpc = mp; // property with retain policy
[mp release];
self.mpc.view.frame = CGRectMake(10, 10, 300, 230);
[self.view addSubview:self.mpc.view];

这使得电影视图成为您界面的一部分。如果电影是真实的电影,则用户可以自由切换是否进入全屏模式。如果电影只是声音,用户就没有办法做到这一点;只有一个停止/运行按钮和一个滑块。

无论哪种方式,故事中的某个地方都会有一个 MPMoviePlayerController,因此您可以注册它的通知,告诉它播放/停止等。但不要混淆或融合这两种方法。这可能是您这里所有问题的原因。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top