Swift: Попытка контролировать время в AVAudioPlayerNode с помощью UISlider - PullRequest
1 голос
/ 29 мая 2019

Я использую 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). Что я не так делаю и могу ли я найти более простой способ изменить текущее время игрока?

...