在Iphone中同步两个或多个AVAudioPlayer的播放

时间:2012-10-02 16:00:13

标签: iphone objective-c synchronization avaudioplayer

我需要在同一时间用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个玩家有延迟...... 任何人都可以解释我,如果这是正确的,为什么? 非常感谢 马西

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”,即您想要继续播放的音轨的秒数。否则,每次用户播放/暂停曲目时,他们都会不同步!