Swift 同步多个玩家

Swift 同步多个玩家,swift,xcode,audiokit,Swift,Xcode,Audiokit,我已经为此挣扎了一段时间。我有很多球员 var players = [AKPlayer]() 我在网上搜索了许多关于同一问题的其他问题,他们都建议使用:AKPlayer.play(atTime:AVAudioTime) 我尝试过这样做(以及其他类似的尝试): 以及其他类似的事情,比如: for audioPlayer in players { audioPlayer.play(when: 0, hostTime: mach_absolute_time()) } 但没有一个成功。

我已经为此挣扎了一段时间。我有很多球员

var players = [AKPlayer]()
我在网上搜索了许多关于同一问题的其他问题,他们都建议使用:
AKPlayer.play(atTime:AVAudioTime)

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

以及其他类似的事情,比如:

 for audioPlayer in players {
     audioPlayer.play(when: 0, hostTime: mach_absolute_time())
 }
但没有一个成功。播放时间之间存在明显差异。(音频文件的长度和格式相同)

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

AKPlayer -> AKPitchShifter 
                            > AKMixer > AudioKit.output
                  AKPlayer       
**上面所有的
AKPlayer
s被附加到
players
数组中

也许这是因为我不了解什么是
AVAudioTime
,以及它是如何工作的

提前谢谢

*******注释****** AKPlayer的say

玩家可以被锁定到一个公共区域 在各种播放功能中使用hostTime实现时钟和视频


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

您的思路是正确的。您只需要获取当前时间,而不是使用audioTime(at:)检索当前时间,因为audioTime(at:)只对已在播放的播放器有用

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

如果任意的0.25缓冲区没有剪切它,请尝试通过调用
player.prepare()
的播放机循环,然后再获取
now()
,以安排开始。

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

您能更详细地解释一下.now()扩展的实现吗?“AudioTime+Double过载”的最后一部分给我带来了一些困惑。没关系。经过一些测试,我发现了。我编辑了你的文章,将其包括在内,以便将来的人们能够找到它。如果有更好的实现,请更改它并让我知道。在获取startTime之前,请尝试在播放器上调用prepare()。您的意思是日程安排(从:,到:,平均时间:)?AKAudioPlayers没有prepare()功能。Akaudioplayer将被AKPlayer.use player.buffering=.替换。始终用于无缝循环。
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)