我正在播放一首歌曲AVAudioPlayerNode
,我正在尝试使用 a 来控制它的时间,UISlider
但我无法弄清楚如何使用AVAUdioEngine
.
问问题
3964 次
2 回答
17
经过多次反复试验,我想我终于弄清楚了。
首先,您需要计算文件的采样率。为此,请获取 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))
接下来,您将要计算音频文件中剩余的帧数:
var length = Float(songDuration!) - Slider.value
var framestoplay = AVAudioFrameCount(Float(playerTime.sampleRate) * length)
最后,停止您的节点,安排新的音频片段,然后重新启动您的节点!
playerNode.stop()
if framestoplay > 1000 {
playerNode.scheduleSegment(audioFile, startingFrame: newsampletime, frameCount: framestoplay, atTime: nil,completionHandler: nil)
}
playerNode.play()
如果您需要进一步解释,我在这里写了一个简短的教程:http ://swiftexplained.com/?p=9
于 2015-05-07T15:00:33.727 回答
3
对于未来的读者,最好将采样率设为:
playerNode.outputFormat(forBus: 0).sampleRate
转换为 AVAudioFramePosition 时也要小心,因为它是一个整数,而采样率是双倍的。如果不对结果进行四舍五入,您最终可能会得到不希望的结果。
PS上面的答案假设你正在播放的文件与播放器的输出格式具有相同的采样率,这可能是真的,也可能不是。
于 2017-10-27T21:13:48.997 回答