Завершающая песня 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)