我正在使用一个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)。我做错了什么?我可以找到一种更简单的方法来更改播放器的 currentTime 吗?
我遇到了同样的问题。显然是framestoplay
始终为 0,这是因为sampleRate
。的价值playerTime.sampleRate
在我的例子中始终为 0。
So,
let framestoplay = AVAudioFrameCount(Float(playerTime.sampleRate) * length)
必须替换为
let framestoplay = AVAudioFrameCount(Float(sampleRate) * length)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)