在设备上测试应用程序时 MPMoviePlayer 声音下降
-
09-10-2019 - |
题
我正在构建一个应用程序,其中包含一个带有电影链接的 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,因此您可以注册它的通知,告诉它播放/停止等。但不要混淆或融合这两种方法。这可能是您这里所有问题的原因。