我必须在给定的时间点执行一个动作(在多个设备上一次播放歌曲而没有延迟)。我的要求是该应用程序不应使用任何互联网连接。所以我需要一个确切的时间点来播放数据(音频)]
我已经尝试过以下操作:
- 5 秒后在所有设备上播放歌曲。(仍然会导致毫秒的延迟)
- 发送小文本通知以识别歌曲的播放,然后开始在所有设备上播放。但是发送和接收这个通知需要几毫秒的时间:(:(
- 在所有设备上将时间设置为自动,然后检查短信传递的时间差,每次测试都有毫秒的差距。
首先,您需要同步 2 台设备的内部时间。显然,您可以在 iOS 上拥有的最准确的时钟是绝对时间:
CFAbsoluteTime now = CFAbsoluteTimeGetCurrent();
然后你需要将这个时间从一个设备发送A
到另一个设备,B
检索设备上的差异B
并将其发送回A
,然后将差异与网络事务中花费的时间进行比较。通过这种方式,您可以非常准确地同步两个设备的时间。(这是假设网络时间在请求和响应之间是对称的,并且您在 device 上的计算没有太多开销B
)。
从那里您可以轻松地在设备上实例化 2AVAudioPlayer
设置歌曲并调用prepareToPlay
,最后根据同步延迟触发播放方法。这应该给你一个不明显的精度。
您可以采取的另一条路线是在AudioUnit
连接到麦克风的第二个设备上放置一个,以便根据第一个设备发出的声音同步音乐。
已知问题
在睡眠或等待极其精确的时间间隔时,计时器可能会延迟最多 1 毫秒。
供参考: https ://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-7.0/