我需要在同一时间用2个AVAudioPlayer对象播放2个声音...所以我在Apple AVAudioPlayer类参考上找到了这个例子(https://developer.apple.com/library/mac/#documentation/AVFoundation /Reference/AVAudioPlayerClassReference/Reference/Reference.html):
- (void) startSynchronizedPlayback {
NSTimeInterval shortStartDelay = 0.01; // seconds
NSTimeInterval now = player.deviceCurrentTime;
[player playAtTime: now + shortStartDelay];
[secondPlayer playAtTime: now + shortStartDelay];
// Here, update state and user interface for each player, as appropriate
}
我不明白的是:为什么secondPlayer也有shorStartDelay? 不应该没有吗?我认为第一个玩家需要0.1秒的延迟,因为它在第二个玩家之前被调用...但在这个代码中,2个玩家有延迟...... 任何人都可以解释我,如果这是正确的,为什么? 非常感谢 马西
答案 0 :(得分:3)
如果你只使用play方法([firstPlayer play];),firstPlayer将在第二个之前启动,因为它将在之前接收调用。
如果没有设置延迟([firstPlayer playAtTime:now];),firstPlayer也将在de second之前启动,因为firstPlayer将检查它应该启动的时间,并且会看到它已经通过了。因此,它将具有与仅使用play方法时相同的行为。
延迟是为了确保两名球员同时开始。它应该足够长,以确保两个玩家在“现在+延迟”时间过去之前接听电话。
我不知道我是否清楚(英语不是我的母语)。如果您有疑问,我可以尝试更清楚
答案 1 :(得分:0)
是的,他说的是 ^ 当时的比赛将安排两名球员在那个时间(将来的某个时候)开始。
为了清楚起见,您可以将“shortStartDelay”设置为 2 秒,您会看到在两个项目开始播放之前会有两秒的暂停。
这里要记住的另一个提示是,当您播放/暂停 AVAudioPlayer 时,它们实际上不会在完全相同的时间停止。所以当你想恢复时,你也应该同步音轨。
Swift 示例:
let currentDeviceTime = firstPlayer.deviceCurrentTime
let trackTime = firstPlayer.currentTime
players.forEach {
$0.currentTime = trackTime
$0.play(atTime: currentDeviceTime + 0.1)
}
players 是一个 AVAudioPlayers 列表,firstPlayer 是数组中的第一项。
请注意我还重置了“currentTime”,即您想要继续播放的音轨的秒数。否则,每次用户播放/暂停曲目时,他们都会不同步!