问题描述
我有一个 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
}