【发布时间】:2012-04-17 09:57:22
【问题描述】:
*我正在创建一个可以观看视频的 iPhone 应用程序... 我一直在制作自己的控件,所以我想实现下一个后退按钮,我可以显示主题,所以对于 UI 来说一切正常,问题是用另一个内容重新启动 MoviePlayer... 有什么想法???
播放完成后我可以使用相同的配置,我的意思是...如果视频结束播放开始播放另一个... 我尝试设置 contentUrl 但它引发了异常:
2012-04-17 11:37:41.198 NexTest2[8218:11f03] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [nan 11.5]'
viewController.m
- (void)viewDidLoad{
[super viewDidLoad];
fileURL = [NSURL URLWithString:urlString];
moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];
moviePlayerController.controlStyle = MPMovieControlStyleNone;
[moviePlayerController setShouldAutoplay:YES];
[self addObservers];
/* Inset the movie frame in the parent view frame. */
CGRect viewInsetRect = CGRectInset ([self.view bounds],0.0, 0.0 );
[[moviePlayerController view] setFrame: viewInsetRect ];
[self.view addSubview:moviePlayerController.view];
[self resizeControlViews];
}
然后在 resizeControlViews 我有这个,因为我正在使用这两个视图,如控件:
-(void)resizeControlViews{
CGRect barFrame = self.controlBarView.frame;
barFrame.origin.x = round((moviePlayerController.view.frame.size.width - barFrame.size.width) / 2.0);
barFrame.origin.y = round((moviePlayerController.view.frame.size.height - barFrame.size.height)/10.0);
self.controlBarView.frame = barFrame;
[moviePlayerController.view addSubview:controlBarView];
CGRect playFrame = self.controlPlaybackView.frame;
playFrame.origin.x = round((moviePlayerController.view.frame.size.width - playFrame.size.width) / 2.0);
playFrame.origin.y = round((moviePlayerController.view.frame.size.height - playFrame.size.height)/1.1);
self.controlPlaybackView.frame = playFrame;
[moviePlayerController.view addSubview:controlPlaybackView];
}
这里一切正常,其中一个视图中有一个控制搜索的滑块,另一个是播放、下一步和后退按钮。 我认为问题可能出在这些视图的 UI 组件上......
我添加了这些观察者来控制播放:
//Add the observers to the player
-(void)addObservers{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStarted:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setDurationLabel:) name:MPMovieDurationAvailableNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];
}
为了在播放器播放时进行处理,我将 MPMoviePlayerPlaybackStateDidChangeNotification 与此选择器一起使用:
//called when the playback state changes of state
- (void)playbackStarted:(NSNotification*)notification {
MPMoviePlayerController *player = notification.object;
if (player.playbackState == MPMoviePlaybackStatePlaying) {
[self timerRunning];
}
}
如果播放器正在“播放”,我会使用以下方法对其进行监控:
-(void)timerRunning{
self.currentTime.text = [self floatToStringTime:(moviePlayerController.currentPlaybackTime)];
self.timeBar.value = moviePlayerController.currentPlaybackTime / moviePlayerController.duration;
if (moviePlayerController.playbackState == MPMoviePlaybackStatePlaying) {
[self performSelector:@selector(timerRunning) withObject:nil afterDelay:0.5];
}
}
所以也许这就是问题所在...但是对于单个视频,它可以完美运行...
我有四个错误在哪里...是在我在线监控以将值设置为滑块时,但我真的不知道为什么,我认为这是另一个视频或停止时的原因视频它仍在执行,因此播放器没有持续时间或当前播放导致此异常的原因...我该如何解决...这是错误...可能将此代码移至另一部分...
self.timeBar.value = moviePlayerController.currentPlaybackTime / moviePlayerController.duration;
【问题讨论】:
-
您能否添加您的代码。一般来说,要再次使用movieplayer,您需要释放该播放器,然后添加新内容。
-
@DimplePanchal 需要释放播放器才能重用它是不正确的。只需设置 contentUrl 就足够了。
-
@Till Ya,我也发现了那个东西,但只为电影播放器设置 contentUrl 通常会在 iphone sdk 中创建无法捕获的崩溃。我不知道它背后的原因,但这是我观察到的情况。
-
@DimplePanchal 它对我来说很好,问题必须隐藏在你的代码中,其他地方。
-
是的,直到你是对的......它应该可以工作,所以我认为问题出在滑块中......因为它在一个视图中,我在这里更新代码......
标签: iphone objective-c ios mpmovieplayercontroller