Ios Swift:尝试使用UISlider控制AVAudioPlayerNode中的时间
我正在使用连接到Ios Swift:尝试使用UISlider控制AVAudioPlayerNode中的时间,ios,swift,seekbar,avaudioengine,avaudioplayernode,Ios,Swift,Seekbar,Avaudioengine,Avaudioplayernode,我正在使用连接到AVAudioEngine的AVAudioPlayerNode来播放声音 要获取玩家的当前时间,我将执行以下操作: extension AVAudioPlayerNode { var currentTime: TimeInterval { get { if let nodeTime: AVAudioTime = self.lastRenderTime, let playerTime: AVAudioTime = self.playerTime(forNod
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
}
}
}
我有一个滑块,指示音频的当前时间。当用户更改滑块值时,在.end
事件中,我必须将播放器的当前时间更改为滑块中指示的时间。
为此:
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)。我做错了什么?我能找到一个更简单的方法来更改播放器的当前时间吗?我遇到了同样的问题。显然,framestoplay
始终为0,这是因为sampleRate
的缘故。在我的例子中,playerTime.sampleRate
的值始终为0
所以
必须替换为
let framestoplay = AVAudioFrameCount(Float(sampleRate) * length)
我遇到了同样的问题。显然,
framestoplay
始终为0,这是因为sampleRate
的缘故。在我的例子中,playerTime.sampleRate
的值始终为0
所以
必须替换为
let framestoplay = AVAudioFrameCount(Float(sampleRate) * length)
您可以通过使用滑块和定义计时器以简单的方式使用它,如果您想要处理点击和拖动,请寻找更好的定义点击手势和使用滑块动作。感谢您尝试@masoud,但您没有回答我的问题。你说的已经实现了。但我想知道的是,在更改滑块值后,如何更改玩家的当前时间。有没有解决方案如何更改当前时间??@ShamDass not ye,如果你发现了什么,请回答这个问题。你可以通过使用滑块和定义计时器简单地使用它。如果你想处理点击和拖动,请寻找更好的定义点击手势和使用滑块动作。谢谢你的尝试@masoud,但你没有回答我的问题。你说的已经实现了。但我想知道的是,在更改滑块值后,如何更改玩家的当前时间。有什么解决方案可以更改当前时间吗???@ShamDass不是ye,如果你发现了什么,请回答这个问题