我在iOS上的MPMoviePlayerController有时播放视频(从本地文件加载)时遇到问题,有时只是静默失败。每次都以相同的方式在应用程序开始时启动相同的视频。当它失败时,它不会以任何方式通知,我只看到一个黑屏。
这是我用来播放视频的代码(这是一个基于 cocos2d-x 的游戏,我将电影播放器控制器作为 EAGLView 的子项附加):
- (void)playVideo:(NSString*)filePath
{
NSURL* url = [NSURL fileURLWithPath:filePath];
_moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:url];
EAGLView* view = [EAGLView sharedEGLView];
_moviePlayerController.view.frame = view.bounds;
_moviePlayerController.movieSourceType = MPMovieSourceTypeFile;
_moviePlayerController.fullscreen = YES;
_moviePlayerController.controlStyle = MPMovieControlStyleNone;
_moviePlayerController.shouldAutoplay = NO;
[view addSubview:_moviePlayerController.view];
[_moviePlayerController prepareToPlay];
}
- (void)videoFinished:(NSNotification*)notification
{
[_moviePlayerController.view removeFromSuperview];
[_moviePlayerController release];
}
- (void)videoLoadStateChanged:(NSNotification*)notification
{
if ((_moviePlayerController.loadState & MPMovieLoadStatePlayable) != 0)
{
[_moviePlayerController play];
}
}
播放失败时,我会收到以下通知:
MPMoviePlayerNowPlayingMovieDidChangeNotification
MPMovieSourceTypeAvailableNotification
仅此而已。当播放工作时,我得到这些:
MPMoviePlayerNowPlayingMovieDidChangeNotification
MPMovieSourceTypeAvailableNotification
(到这里为止,与失败时相同)MPMovieMediaTypesAvailableNotification
MPMovieMediaTypesAvailableNotification
MPMovieDurationAvailableNotification
MPMoviePlayerLoadStateDidChangeNotification
MPMoviePlayerLoadStateDidChangeNotification
MPMoviePlayerPlaybackStateDidChangeNotification
MPMovieNaturalSizeAvailableNotification
MPMoviePlayerReadyForDisplayDidChangeNotification
MPMoviePlayerPlaybackStateDidChangeNotification
MPMoviePlayerPlaybackDidFinishNotification
我尝试了几种不同的替代方案,包括使用MPMoviePlayerViewController,但每次我都得到同样奇怪的行为。有什么想法吗?
我的问题最终与症状完全无关......
这似乎是在iOS 7上运行的Crittercism的某种错误。在我们的控制台("(webView:decidePolicyForNavigationAction:request:frame:decisionListener:)
failed to return after waiting 10 seconds"
)中查看调试消息时,我们遇到了这个问题:iOS 7 UIWebView无法渲染,这表明安装Crittercism的更新版本。这样做之后,我们的视频播放问题似乎已解决。