ios - Why does my time UILabels skip 2 seconds when it resumes play from a pause state? -
i'm having weird issue using mpmovieplayercontroller
. have currenttimelabel
representing current playback time , endtimelabel
representing remaining playback time. function update labels fired off every 1 second using nstimer
.
this coincides uislider
increments every second video plays. however, problem is, video playing, , tap pause button, when tap play button again, currenttimelabel
, endtimelabel
jumps 2 seconds wherever last stopped.
here's provided code:
override func viewdidload() { super.viewdidload() print("viewdidload") nsnotificationcenter.defaultcenter().addobserver( self, selector: "movieplayerplaybackstatedidchangenotification:", name: mpmovieplayerplaybackstatedidchangenotification, object: nil) nsnotificationcenter.defaultcenter().addobserver( self, selector: "movieplayerloadstatedidchangenotification:", name: mpmovieplayerloadstatedidchangenotification, object: nil) setupvideoplayer() isplaybackslidertouched = false ispausebuttontouched = false } override func viewdidappear(animated: bool) { super.viewdidappear(true) print("viewdidappear") timer = nstimer.scheduledtimerwithtimeinterval(1, target: self, selector: "updateplaybackslider", userinfo: nil, repeats: true) playpausebutton.addtarget(self, action: "onclick:", forcontrolevents: .touchupinside) } func convertsecondstohhmmss(seconds: double) -> string { let time: int = int( floor(seconds) ) print("time = \(time)") // convert hours let hh: int = time / 3600 // convert minutes let mm: int = (time / 60) % 60 // convert seconds let ss: int = time % 60 print("seconds = \(ss)") if hh > 0 { return string(format: "%02d:%02d:%02d", hh, mm, ss) } else { return string(format: "%02d:%02d", mm, ss ) } } func updateplaybackslider() { if isplaybackslidertouched == false { print("playbackslider not touched!") print("youtubevideoplayer.movieplayer.currentplaybacktime = \(youtubevideoplayer.movieplayer.currentplaybacktime)") print("youtubevideoplayer.movieplayer.duration = \(youtubevideoplayer.movieplayer.duration)") let slidervalue: float = float(youtubevideoplayer.movieplayer.currentplaybacktime / youtubevideoplayer.movieplayer.duration) print("slidervalue = \(slidervalue)") if !slidervalue.isnan { self.playbackslider.setvalue(slidervalue, animated: true) self.currenttimelabel.text = self.convertsecondstohhmmss(self.youtubevideoplayer.movieplayer.currentplaybacktime) self.endtimelabel.text = "-" + self.convertsecondstohhmmss(self.youtubevideoplayer.movieplayer.duration - self.youtubevideoplayer.movieplayer.currentplaybacktime) print("currenttimelabel.text = \(currenttimelabel.text)") print("endtimelabel.text = \(endtimelabel.text)") } } } func onclick(sender: uibutton) { print("onclick") if sender == playpausebutton { print("playpausebutton touched") if sender.selected { print("player play") timer = nstimer.scheduledtimerwithtimeinterval(1, target: self, selector: "updateplaybackslider", userinfo: nil, repeats: true) ispausebuttontouched = false youtubevideoplayer.movieplayer.play() sender.selected = false } else { print("player paused") ispausebuttontouched = true timer.invalidate() timer = nil youtubevideoplayer.movieplayer.pause() sender.selected = true } } } func movieplayerplaybackstatedidchangenotification(notification: nsnotification) { print("movieplayerplaybackstatedidchangenotification") let state: mpmovieplaybackstate = youtubevideoplayer.movieplayer.playbackstate switch state { case mpmovieplaybackstate.stopped: print("stopped") break case mpmovieplaybackstate.interrupted: print("interrupted") break case mpmovieplaybackstate.seekingforward: print("forward") break case mpmovieplaybackstate.seekingbackward: print("backward") break case mpmovieplaybackstate.paused: print("paused") break case mpmovieplaybackstate.playing: print("playing") break } } func movieplayerloadstatedidchangenotification(notification: nsnotification) { print("movieplayerloadstatedidchangenotification") let state: mpmovieloadstate = youtubevideoplayer.movieplayer.loadstate switch state { case mpmovieloadstate.playable: print("playing") break case mpmovieloadstate.playthroughok: print("playthroughok") break case mpmovieloadstate.stalled: print("stalled") break case mpmovieloadstate.unknown: print("unknown") break default: break } }
here's output couple seconds of video playback:
viewdidload setupvideoplayer viewdidappear movieplayerloadstatedidchangenotification time = 0 seconds = 0 time = 29 seconds = 29 playing movieplayerloadstatedidchangenotification movieplayerplaybackstatedidchangenotification playing playbackslider not touched! youtubevideoplayer.movieplayer.currentplaybacktime = 0.0 youtubevideoplayer.movieplayer.duration = 29.8833333333333 slidervalue = 0.0 time = 0 seconds = 0 time = 29 seconds = 29 currenttimelabel.text = optional("00:00") endtimelabel.text = optional("-00:29") playbackslider not touched! youtubevideoplayer.movieplayer.currentplaybacktime = 0.484628237 youtubevideoplayer.movieplayer.duration = 29.8833333333333 slidervalue = 0.016255 time = 0 seconds = 0 time = 29 seconds = 29 currenttimelabel.text = optional("00:00") endtimelabel.text = optional("-00:29") playbackslider not touched! youtubevideoplayer.movieplayer.currentplaybacktime = 1.484112736 youtubevideoplayer.movieplayer.duration = 29.8833333333333 slidervalue = 0.0496863 time = 1 seconds = 1 time = 28 seconds = 28 currenttimelabel.text = optional("00:01") endtimelabel.text = optional("-00:28") onclick playpausebutton touched player paused movieplayerplaybackstatedidchangenotification paused ispausebuttontouched = true onclick playpausebutton touched player play movieplayerplaybackstatedidchangenotification playing playbackslider not touched! youtubevideoplayer.movieplayer.currentplaybacktime = 3.34555252 youtubevideoplayer.movieplayer.duration = 29.8833333333333 slidervalue = 0.111982 time = 3 seconds = 3 time = 26 seconds = 26 currenttimelabel.text = optional("00:03") endtimelabel.text = optional("-00:26") movieplayerplaybackstatedidchangenotification paused
as can see in output, currenttimelabel.text = optional("00:01")
time when tapped pause. when tap play, output should currenttimelabel.text = optional("00:02")
, shows currenttimelabel.text = optional("00:03")
. endtimelabel
skips 2 seconds.
why happening , how can resolve it?
thanks
resume timer in playing state. might solve issue.
case mpmovieplaybackstate.playing:{ print("playing") timer = nstimer.scheduledtimerwithtimeinterval(1, target: self, selector: "updateplaybackslider", userinfo: nil, repeats: true) break }
Comments
Post a Comment