同步多个 AKPlayer

Synchronizing multiple AKPlayers

我已经为此苦苦挣扎了一段时间。我有一系列 AKPlayer。

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())
 }

但其中 none 有效。播放时间之间存在明显差异。 (音频文件长度相同,格式相同)。

如果有帮助,我的设置如下:

AKPlayer -> AKPitchShifter 
                            > AKMixer > AudioKit.output
                  AKPlayer       

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

可能是因为我不了解 AVAudioTime 是什么以及它是如何工作的。

提前致谢。

******* 注释 ****** AKPlayerdocs

Players can be locked to a common clock as well as video by using hostTime in the various play functions

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

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

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

如果任意 0.25 缓冲区没有削减它,请尝试在让 now() 开始调度之前循环播放调用 player.prepare() 的玩家。

我也有同样的问题,我用的是mr. 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)