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