同步Iphone中两个或多个AVAudioPlayer的播放
Posted
技术标签:
【中文标题】同步Iphone中两个或多个AVAudioPlayer的播放【英文标题】:Synchronize the playback of two or more AVAudioPlayer in Iphone 【发布时间】:2012-10-02 16:00:12 【问题描述】:我需要同时使用 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 个玩家有延迟...... 任何人都可以向我解释这是否正确,为什么? 非常感谢 马西
【问题讨论】:
【参考方案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”,即您想要继续播放音轨的秒数。否则,每次用户播放/暂停曲目时,他们都会失去同步!
【讨论】:
以上是关于同步Iphone中两个或多个AVAudioPlayer的播放的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Objective-C 中管理、跟踪或同步多个服务器的异步请求?