Swift - 如何在循环时获取 AVAudioPlayerNode 的当前位置?

问题描述

我有一个 AVAudioPlayerNode 循环播放歌曲的一段:

audioPlayer.scheduleBuffer(segment,at: nil,options:.loops)

我想在播放时获取歌曲的当前位置。通常,这是通过计算 = currentFrame / audioSampleRate

哪里

var currentFrame: AVAudioFramePosition {
        
        guard let lastRenderTime = audioPlayer.lastRenderTime,let playerTime = audioPlayer.playerTime(forNodeTime: lastRenderTime) else {
                return 0
        }
        return playerTime.sampleTime
    }

然而,当循环结束并重新开始时,currentFrame 不会重新开始。但它仍然增加,这使得 currentFrame / audioSampleRate 作为当前位置不正确。

那么计算当前位置的正确方法是什么?

解决方法

好的旧模将完成这项工作:

public var currentTime: TimeInterval {
    guard let nodeTime = player.lastRenderTime,let playerTime = player.playerTime(forNodeTime: nodeTime) else {
            return 0
    }
    let time = (Double(playerTime.sampleTime) / playerTime.sampleRate)
        .truncatingRemainder(dividingBy: Double(file.length) / Double(playerTime.sampleRate))
    return time
}