【发布时间】:2011-08-08 13:12:00
【问题描述】:
MPMoviePlayerController 似乎存在问题,一旦您处于全屏模式并按住快进按钮,让它一直向前搜索(以快速播放)直到视频结束。
此后,您只是黑屏并且卡住了。换句话说,它不会响应任何轻击手势,您无法摆脱这种情况。有没有其他人遇到过这个问题?
有没有办法在代码中解决它?
【问题讨论】:
标签: ipad mpmovieplayercontroller fullscreen
MPMoviePlayerController 似乎存在问题,一旦您处于全屏模式并按住快进按钮,让它一直向前搜索(以快速播放)直到视频结束。
此后,您只是黑屏并且卡住了。换句话说,它不会响应任何轻击手势,您无法摆脱这种情况。有没有其他人遇到过这个问题?
有没有办法在代码中解决它?
【问题讨论】:
标签: ipad mpmovieplayercontroller fullscreen
这似乎是一个 iOS 错误,因为快退到一开始不会导致黑屏,但快进到最后会,之后对视频播放器的“播放”/“暂停”调用将无法正常工作。我通过在洗涤器刷新回调中添加受保护的逻辑来临时解决此问题: 让我们假设 monitorPlaybackTime 将在 'PLAY_BACK_TIME_MONITOR_INTERVAL' 秒内被调用以刷新清理器,并在其中添加一个检查逻辑:
NSTimeInterval duration = self.moviePlayer.duration;
NSTimeInterval current = self.moviePlayer.currentPlaybackTime;
if (isnan(current) || current > duration) {
current = duration;
} else if (self.moviePlayer.playbackState == MPMoviePlaybackStateSeekingForward) {
if (current + self.moviePlayer.currentPlaybackRate*PLAY_BACK_TIME_MONITOR_INTERVAL > duration) {
[self.moviePlayer endSeeking];
}
}
一个解决黑屏的方法,不完美,希望能有所帮助。
【讨论】:
我猜你没有处理MPMoviePlayerPlaybackDidFinishNotification。如果你不是,你真的应该这样做。
电影播放器会像您描述的那样进入“卡住”状态,这对我来说仍然是出乎意料的。我更愿意期待它自动停止播放并在播放结束时重置。无论如何,我认为如果您观察 MPMoviePlayerPlaybackDidFinishNotification 并适当地处理电影控制器,您的问题就会消失。
【讨论】:
在 iOS6 上遇到了同样的问题。通过以下实现注册 MPMoviePlayerPlaybackDidFinishNotification(由 Leuguimerius 建议)设法修复它:
- (void)playbackDidFisnish:(NSNotification *)notif {
if (self.player.currentPlaybackTime <= 0.1) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.player stop];
[self.player play];
[self.player pause];
});
}
}
其中 self.player 是关联的 MPMoviePlayerController 实例。对 currentPlaybackTime 的检查用于区分更标准的playbackDidFinish 调用(允许电影以正常速度播放直到结束)与用户快进直到结束的场景。停止然后播放和暂停会产生一个可用的、视觉上一致的界面,即使快进到最后也是如此。
【讨论】:
上述解决方案都不适合我,所以这就是我最终要做的:
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("moviePlayerLoadStateDidChange"), name: MPMoviePlayerLoadStateDidChangeNotification, object: nil)
func moviePlayerLoadStateDidChange() {
let loadState = moviePlayerController?.loadState
if loadState == MPMovieLoadState.Unknown {
moviePlayerController?.contentURL = currentmovieURL
moviePlayerController?.prepareToPlay()
}
}
我认为问题在于,当单按前进按钮时,它想跳到下一个视频,这就是出现加载指示器的原因。监听加载状态改变事件,你可以指定下一个视频应该是什么,如果你没有,你可以给它相同的url。
【讨论】: