我正在使用连接到AVAudioEngine的AVAudioPlayerNode来播放声音。
为了获得玩家的当前时间,我这样做:
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)。我做错了什么?我能找到一种更简单的方法来改变播放器的currentTime吗?
发布于 2020-01-02 18:47:53
我遇到了同样的问题。显然,由于sampleRate,framestoplay始终为0。在我的例子中,playerTime.sampleRate的值始终为0。
所以,
let framestoplay = AVAudioFrameCount(Float(playerTime.sampleRate) * length)必须替换为
let framestoplay = AVAudioFrameCount(Float(sampleRate) * length)https://stackoverflow.com/questions/56355698
复制相似问题