Я использую AVAudioPlayerNode
, прикрепленный к AVAudioEngine
, для воспроизведения звука.
чтобы узнать текущее время игрока, я делаю это:
extension AVAudioPlayerNode {
var currentTime: TimeInterval {
get {
if let nodeTime: AVAudioTime = self.lastRenderTime, let playerTime: AVAudioTime = self.playerTime(forNodeTime: nodeTime) {
return Double(playerTime.sampleTime) / playerTime.sampleRate
}
return 0
}
}
}
У меня есть ползунок, который указывает текущее время аудио. Когда пользователь изменяет значение ползунка, в случае события .ended
мне нужно изменить текущее время проигрывателя на указанное в ползунке.
Для этого:
extension AVAudioPlayerNode {
func seekTo(value: Float, audioFile: AVAudioFile, duration: Float) {
if let nodetime = self.lastRenderTime{
let playerTime: AVAudioTime = self.playerTime(forNodeTime: nodetime)!
let sampleRate = self.outputFormat(forBus: 0).sampleRate
let newsampletime = AVAudioFramePosition(Int(sampleRate * Double(value)))
let length = duration - value
let framestoplay = AVAudioFrameCount(Float(playerTime.sampleRate) * length)
self.stop()
if framestoplay > 1000 {
self.scheduleSegment(audioFile, startingFrame: newsampletime, frameCount: framestoplay, at: nil,completionHandler: nil)
}
}
self.play()
}
Однако моя функция seekTo
работает неправильно (я печатаю currentTime до и после функции, и она всегда показывает отрицательное значение ~ = -0.02). Что я не так делаю и могу ли я найти более простой способ изменить текущее время игрока?