5

我必须在给定的时间点执行一个动作(在多个设备上一次播放歌曲而没有延迟)。我的要求是该应用程序不应使用任何互联网连接。所以我需要一个确切的时间点来播放数据(音频)]

我已经尝试过以下操作:

  1. 5 秒后在所有设备上播放歌曲。(仍然会导致毫秒的延迟)
  2. 发送小文本通知以识别歌曲的播放,然后开始在所有设备上播放。但是发送和接收这个通知需要几毫秒的时间:(:(
  3. 在所有设备上将时间设置为自动,然后检查短信传递的时间差,每次测试都有毫秒的差距。
4

2 回答 2

6

首先,您需要同步 2 台设备的内部时间。显然,您可以在 iOS 上拥有的最准确的时钟是绝对时间:

CFAbsoluteTime now = CFAbsoluteTimeGetCurrent();

然后你需要将这个时间从一个设备发送A到另一个设备,B检索设备上的差异B并将其发送回A,然后将差异与网络事务中花费的时间进行比较。通过这种方式,您可以非常准确地同步两个设备的时间。(这是假设网络时间在请求和响应之间是对称的,并且您在 device 上的计算没有太多开销B)。

在此处输入图像描述

从那里您可以轻松地在设备上实例化 2AVAudioPlayer设置歌曲并调用prepareToPlay,最后根据同步延迟触发播放方法。这应该给你一个不明显的精度。

您可以采取的另一条路线是在AudioUnit连接到麦克风的第二个设备上放置一个,以便根据第一个设备发出的声音同步音乐。

于 2013-10-15T11:48:45.980 回答
1

已知问题

在睡眠或等待极其精确的时间间隔时,计时器可能会延迟最多 1 毫秒。

供参考: https ://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-7.0/

于 2013-10-15T12:13:03.760 回答