我有多个音频文件,我想连续播放,并能够使用UISlider
来控制它。我正在使用AVAudioPlayer
,但每个曲目之间存在间隙问题。所以我找到AVQueuePlayer
,现在没有差距。但是现在我设置AVQueuePlayer
以确定UISlider
值更改后的资产和时间时出现问题。
我有不同的每个音轨的持续时间,我想滑块为每个音轨都有相同的切片,所以我得到最大音轨的最大持续时间,然后获得每个音轨的加速度。以下是我在播放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
来纠正时间。有更好的解决方案吗?