AVQueuePlayer - 使用滑块一次控制所有音轨

时间:2015-10-01 08:44:27

标签: ios swift avplayer uislider avqueueplayer

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

0 个答案:

没有答案