0

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

4

2 回答 2

3

如果只使用播放方法([firstPlayer play];),firstPlayer 将在第二个之前启动,因为它会在之前收到调用。

如果您没有设置延迟([firstPlayer playAtTime:now];),那么 firstPlayer 也会在第二个之前开始,因为 firstPlayer 会检查它应该开始的时间,并且会看到它已经过去了。因此,它将具有与仅使用 play 方法时相同的行为。

延迟在这里是为了确保两个玩家同时开始。它应该足够长以确保两个玩家在“现在+延迟”时间过去之前收到呼叫。

我不知道我是否清楚(英语不是我的母语)。如果您有问题,我可以尝试更清楚

于 2013-02-19T16:19:48.313 回答
0

是的,他说的 ^ 当时的比赛将安排两名球员在那个时候开始(将来的某个时间)。

为了清楚起见,您可以将“shortStartDelay”设置为 2 秒,您会看到在两个项目开始播放之前会有两秒的暂停。

这里要记住的另一个提示是,当您播放/暂停 AVAudioPlayer 时,它们实际上并没有在完​​全相同的时间停止。因此,当您想恢复时,您还应该同步音轨。

快速示例:

 let currentDeviceTime = firstPlayer.deviceCurrentTime
                        let trackTime = firstPlayer.currentTime
                        players.forEach {
                            $0.currentTime = trackTime
                            $0.play(atTime: currentDeviceTime + 0.1)
                        }

其中 player 是 AVAudioPlayers 列表, firstPlayer 是数组中的第一项。

请注意,我还如何重置“currentTime”,即您想要继续播放音轨的秒数。否则,每次用户播放/暂停曲目时,他们都会失去同步!

于 2021-07-10T21:31:22.717 回答