Завершающая песня avplayer на seekToTime

Я пытаюсь, чтобы avPlayer перезапустил текущую песню, когда выбрана кнопка пропуска назад, если она находится примерно через 5 секунд в песне, и перескочил к временам в зависимости от того, куда перемещен ползунок. Вот мой код для этих функций:

@IBAction func buttonBackTouchDown(sender: AnyObject) {
    if (Float(CMTimeGetSeconds((avPlayerItem?.currentTime())!)) > 5) {
        //restartSong = true
        avPlayer.currentItem!.seekToTime(kCMTimeZero)
        //self.loadSongValues()
        //restartSongTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("setRestartSongToFalse"), userInfo: nil, repeats: false)
    }
    else if (Float(CMTimeGetSeconds((avPlayerItem?.currentTime())!)) < 5) {
        self.previousSong()
    }
}


@IBAction func sliderTouchDown(sender: AnyObject) {
        self.sliderTimer.invalidate()
        avPlayer.pause()
        self.overlayOn()
    }


@IBAction func sliderTouchUpInside(sender: AnyObject) {
        //restartSongTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("setRestartSongToFalse"), userInfo: nil, repeats: false)
        //NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("startSliderTimer"), userInfo: nil, repeats: false)
        self.startLabelTimer()
        avPlayer.play()
        self.updateNowPlayingInfoCenter()
        self.overlayOff()
    }

У меня проблема в том, что если песня длится более 1 минуты, или она почти закончена, и я переместил ползунок слишком далеко назад, он ИНОГДА вызывает этого наблюдателя:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "skipSong", name: AVPlayerItemDidPlayToEndTimeNotification, object: avPlayerItem)

Я попытался просмотреть ссылки Apple и посмотреть другие вопросы здесь, на Stackru, но ничего не смог найти.

Может быть, я не понимаю, как правильно использовать CMTime, или что-то странное с файлами, но это действительно странно для меня.

Любая помощь приветствуется. Заранее спасибо!

1 ответ

Решение

У меня также много проблем с AVPlayer и, в частности, с методом SeekToTime.

Когда вы делаете

avPlayer.currentItem!.seekToTime(kCMTimeZero)

avPlayer переходит к 0 кадру, а не к первому кадру, как это должно быть. Кадр № 0 и последний кадр кажутся одинаковыми для AVPlayer. Попробуйте следующее: (например, переход на время 0,001 вместо 0)

        let seekTime : CMTime = CMTimeMake(1, 1000)
        avPlayer!.seekToTime(seekTime)
Другие вопросы по тегам