同步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的播放的主要内容,如果未能解决你的问题,请参考以下文章

如何完美同步两个或多个 html5 视频标签?

如何在 Objective-C 中管理、跟踪或同步多个服务器的异步请求?

iPhone播放声音时如何操作?

如何让 iPhone SpringBoard 为一个应用程序包显示两个或多个图标?

MATLAB 让两个或多个AXES同步旋转

MATLAB 让两个或多个AXES同步旋转