AVAudioEngine寻找歌曲的时间

我正在使用AVAudioPlayerNode播放歌曲,我试图用UISlider来控制它的时间,但我无法弄清楚如何使用AVAUdioEngine寻找时间。

经过很多反复试验,我想我终于明白了这一点。

首先你需要计算你的文件的采样率。 为此,获取AudioNode的最后一次渲染时间:

 var nodetime: AVAudioTime = self.playerNode.lastRenderTime var playerTime: AVAudioTime = self.playerNode.playerTimeForNodeTime(nodetime) var sampleRate = playerTime.sampleRate 

然后,以秒为单位乘以新的时间。 这会给你想要启动播放器的歌曲的确切帧:

 var newsampletime = AVAudioFramePosition(sampleRate * Double(Slider.value)) 

接下来,您将要计算audio文件中剩余的帧数量:

 var length = Float(songDuration!) - Slider.value var framestoplay = AVAudioFrameCount(Float(playerTime.sampleRate) * length) 

最后,停止节点,安排新的audio段,然后重新启动节点!

 playerNode.stop() if framestoplay > 1000 { playerNode.scheduleSegment(audioFile, startingFrame: newsampletime, frameCount: framestoplay, atTime: nil,completionHandler: nil) } playerNode.play() 

如果您需要进一步解释,我在这里写了一个简短的教程: http : //swiftexplained.com/?p=9

对于未来的读者,可能更好的取样率为:

playerNode.outputFormat(forBus: 0).sampleRate

转换为AVAudioFramePosition时也要小心,因为它是一个整数,而采样率是一倍。 没有四舍五入的结果,你可能会得到不希望的结果。

PS上面的答案假定您正在播放的文件具有与播放器的输出格式相同的采样率,这可能是也可能不是真的。