我有多个音频文件,我想连续播放,并能够用 UISlider
控制它 . 我正在使用 AVAudioPlayer
,但每个轨道之间存在间隙问题 . 所以我找到 AVQueuePlayer
,现在没有差距 . 但是,当 UISlider
值发生变化时,我将问题设置为 AVQueuePlayer
到正确的资产和时间 .
我有不同的每个音轨的持续时间,我想滑块每个音轨有相同的切片,所以我获得最大音轨的最大持续时间,然后获得每个音轨的加速度 . 以下是我在播放AVQueuePlayer时更新滑块的方法:
func updateSliderProgress() {
var value: Float = 0
if let track = tracks[self.playingIndex] {
value = Float(self.playingIndex) * self.maximumDuration + Float(CMTimeGetSeconds(audioQueuePlayer.currentTime())) * track.acceleration
}
playerSlider.setValue(value, animated: false)
}
这是AVPlayerItem结束时的通知:
func playerItemDidReachEnd(sender: AnyObject) {
self.playingIndex++
...
}
它正在运行,UISlider正在进行中 . 但我有其他方式的问题:
@IBAction func playerSliderValueChanged(sender: AnyObject) {
let seconds = Double(self.getSeekTime(self.playerSlider.value))
audioQueuePlayer.seekToTime(CMTimeMakeWithSeconds(seconds, 1000))
}
函数 seekToTime
继承自 AVPlayer
,它只为当前曲目设置时间,对吧?那么是否可以更改当前 AVPlayerItem
(通过索引或类似的东西)然后在该项目中应用时间?我发现只是方法 advanceToNextItem
但我希望更多功能改变当前项目 .
所以现在只有我想到的解决方案就是每次用户使用滑块我创建新的 AVQueuePlayer
使用 advanceToNextItem
来设置正确的轨道,然后使用 seekToTime
来获得正确的时间 . 有更好的解决方案吗?