为什么使用AVPlayer中的addPeriodicTimeObserverForInterval来更新我的进度滑块3次的函数?

时间:2016-03-09 16:09:43

标签: ios swift avplayer uislider

您好我一直在试图弄清楚这个问题而且不知道在哪里看。我正在使用AVPlayer来播放视频,并且我有一个UISlider,其值会根据视频的进度每秒更新addPeriodicTimeObserverForInterval

当我按下暂停时,UISlider拇指会按预期立即停止。然而,在我按下播放以恢复视频后,拇指会立即移动,然后每秒继续正常前进。

我无法弄清楚为什么会这样做。我希望UISlider拇指能够流畅地进行,即如果我在1.5秒内暂停了视频,并且我再次播放视频,它应该在拇指再次移动之前等待0.5秒。

以下是我的代码片段:

override func viewDidLoad()

{
    super.viewDidLoad()

    ....        

    isPlaybackSliderTouched = false

    isPauseButtonTouched = false

    setUpPlayerControls()

    ....
}

override func viewDidAppear(animated: Bool)
{
    super.viewDidAppear(true)

    let timeIntervalOne: CMTime = CMTimeMakeWithSeconds(1.0, 10)

    playbackSliderTimer = avPlayer.addPeriodicTimeObserverForInterval(timeIntervalOne,
        queue: dispatch_get_main_queue()) { (elapsedTime: CMTime) -> Void in

        self.observeTime(elapsedTime)
    }

    ....

    playPauseButton.addTarget(self, action: "onClick:", forControlEvents: .TouchUpInside)
}

func observeTime(elapsedTime: CMTime)
{
    let duration = CMTimeGetSeconds(avPlayer.currentItem!.duration)

    if isfinite(duration) && avPlayer.rate == 1
    {
        print("ENNNTNTTERRR")

        let elapsedTime = CMTimeGetSeconds(elapsedTime)

        updatePlaybackSlider(elapsedTime: elapsedTime, duration: duration)
    }
}

func updatePlaybackSlider(elapsedTime: Float64, duration: Float64)
{
    if isPlaybackSliderTouched == false
    {
        let sliderValue: Float = Float(elapsedTime / duration)

        print("sliderValue = \(sliderValue)")

        self.playbackSlider.setValue(sliderValue, animated: true)

        self.currentTimeLabel.text = self.convertSecondsToHHMMSS(elapsedTime)
        self.endTimeLabel.text = self.convertSecondsToHHMMSS(duration - elapsedTime)

        print("currentTimeLabel.text = \(currentTimeLabel.text)")
        print("endTimeLabel.text = \(endTimeLabel.text)")
    }
}

func convertSecondsToHHMMSS(seconds: Float64) -> String
{
    let time: Int = Int( floor(seconds) )

    print("time = \(time)")

    let hh: Int = time / 3600

    let mm: Int = (time / 60) % 60

    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 )
    }
}

deinit
{
    avPlayer.removeTimeObserver(playbackSliderTimer)
}

func onClick(sender: UIButton)
{
    print("onClick")
    if sender == playPauseButton
    {
        print("playPauseButton touched")

        let playerIsPlaying:Bool = avPlayer.rate > 0 

        if (playerIsPlaying)
        {
            isPauseButtonTouched = true
            avPlayer.pause()
            sender.selected = true
        }
        else
        {
            isPauseButtonTouched = false
            avPlayer.play()
            sender.selected = false
        }
     }
}

这是我从播放状态按暂停后立即输出的示例:

setUpPlayerControls
viewDidAppear
ENNNTNTTERRR
sliderValue = 0.0
time = 0
seconds = 0
time = 39
seconds = 39
currentTimeLabel.text = Optional("00:00")
endTimeLabel.text = Optional("-00:39")
ENNNTNTTERRR
sliderValue = 4.76564e-05
time = 0
seconds = 0
time = 39
seconds = 39
currentTimeLabel.text = Optional("00:00")
endTimeLabel.text = Optional("-00:39")
ENNNTNTTERRR
sliderValue = 0.0252767
time = 1
seconds = 1
time = 38
seconds = 38
currentTimeLabel.text = Optional("00:01")
endTimeLabel.text = Optional("-00:38")
ENNNTNTTERRR
sliderValue = 0.0505207
time = 2
seconds = 2
time = 37
seconds = 37
currentTimeLabel.text = Optional("00:02")
endTimeLabel.text = Optional("-00:37")
handleSingleTap
onClick
playPauseButton touched
pause touched

当我从暂停状态点击播放时,这是继续输出:

onClick
playPauseButton touched
play touched
ENNNTNTTERRR
sliderValue = 0.0718539
time = 2
seconds = 2
time = 36
seconds = 36
currentTimeLabel.text = Optional("00:02")
endTimeLabel.text = Optional("-00:36")
ENNNTNTTERRR
sliderValue = 0.0722224
time = 2
seconds = 2
time = 36
seconds = 36
currentTimeLabel.text = Optional("00:02")
endTimeLabel.text = Optional("-00:36")
ENNNTNTTERRR
sliderValue = 0.0757659
time = 3
seconds = 3
time = 36
seconds = 36
currentTimeLabel.text = Optional("00:03")
endTimeLabel.text = Optional("-00:36")
ENNNTNTTERRR
sliderValue = 0.101012
time = 4
seconds = 4
time = 35
seconds = 35
currentTimeLabel.text = Optional("00:04")
endTimeLabel.text = Optional("-00:35")

当我按下播放时按暂停到第二个输出的开头时,您可以看到第一个输出的结束,有2个不必要的时间00:02observeTime(elapsedTime)的调用,转动调用我的updatePlaybackSlider,然后稍微将滑块值稍微向右移动一点,然后再像往常一样调用observeTime(elapsedTime),即每隔1秒。

有什么建议让我解决这个问题?

感谢。

0 个答案:

没有答案