【问题标题】:Synchronize the playback of two or more AVAudioPlayer in Iphone同步Iphone中两个或多个AVAudioPlayer的播放
【发布时间】:2023-11-09 08:22:02
【问题描述】:

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

【问题讨论】:

    标签: iphone objective-c synchronization avaudioplayer


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      这里要记住的另一个提示是,当您播放/暂停 AVAudioPlayer 时,它们实际上不会在完全相同的时间停止。所以当你想恢复时,你也应该同步音轨。

      Swift 示例:

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

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

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

      【讨论】: