我有多个音频文件,我想连续播放,并能够用 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 来获得正确的时间 . 有更好的解决方案吗?