同步多个AKPlayers

时间:2018-02-23 21:44:01

标签: swift xcode audiokit

我一直在努力解决这个问题。我有一系列AKPlayers。

var players = [AKPlayer]()

我在网上搜索过很多关于同一问题的问题,他们都建议使用:AKPlayer.play(atTime: AVAudioTime)

我通过做(以及其他类似的尝试)尝试过这个:

    var sampleRate = selectedSong!.channels[0].audioFile!.sampleRate
    var sampleTime = players[0].audioTime(at: players[0].currentTime)?.sampleTime
    var startTime = AVAudioTime(sampleTime: sampleTime! + Int64(0.25*sampleRate), atRate: sampleRate)

    for audioPlayer in players {
        audioPlayer.play(at: startTime)
    }

和其他类似的事情:

 for audioPlayer in players {
     audioPlayer.play(when: 0, hostTime: mach_absolute_time())
 }

但它们都没有奏效。播放时间之间存在明显差异。 (AudioFiles长度相同,格式相同)。

如果有用,我的设置如下:

AKPlayer -> AKPitchShifter 
                            > AKMixer > AudioKit.output
                  AKPlayer       

**以上所有AKPlayer都附加到players数组。

也许这是因为我对AVAudioTime是什么以及它是如何工作缺乏了解。

提前致谢。

*******注意****** AKPlayer的{​​{3}}说

  

玩家可以锁定普通玩家    时钟和视频在各种播放功能中使用hostTime

但是没有提供同步到hostTime的示例。

2 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。你只需要获取当前时间,而不是使用audioTime(at :)检索它,这只对已播放的播放器有用。

// .now() is a convenience extension and AVAudioTime + Double is overloaded.
var startTime = AVAudioTime.now() + 0.25 

如果任意0.25缓冲区没有切断它,请尝试循环播放调用player.prepare()的玩家,然后再now()进行调度开始。

答案 1 :(得分:0)

我有同样的问题,我用先生。 Dave234解决方案的第一个播放是同步,但似乎第二个循环有一点明显的延迟。这是我的代码。

playerOne.looping = true
playerTwo.looping = true
playerThree.looping = true
playerFour.looping = true
playerFive.looping = true

let startTime = AVAudioTime.now() + 0.25
playerOne.play(at: startTime)
playerTwo.play(at: startTime)
playerThree.play(at: startTime)
playerFour.play(at: startTime)
playerFive.play(at: startTime)