如何通过websockets同步两个javascript计时器

时间:2012-12-23 01:31:40

标签: javascript node.js audio websocket

我有一个带有js视觉节拍器(如导体)的站点,可以通过多台机器上的websocket触发。 如何让节拍器的启动尽可能同步?

感谢。

3 个答案:

答案 0 :(得分:4)

我要做的是测量延迟,并相应地进行补偿。

对于服务器的每个连接,服务器应该定期发送ping消息(不是真正的ICMP ping ...只是通过已建立的websocket通道发送一些消息),并测量从中获取响应所需的时间客户端。将此延迟除以2,您对消息从服务器到客户端所花费的时间有一个不错的猜测。

一旦你知道了这一点,你就可以估计两个客户之间的时间差异,并进行相应的调整。

请注意,这绝不是完美的。我会将你的节拍器时钟完全保留在客户端,并且只使用与服务器的通信进行调整。这将为用户提供更顺畅的性能。

答案 1 :(得分:2)

这是一个clock recovery问题。

您将面临的问题是每个系统的挂壁时间可能会有所不同,而且,从长远来看,它往往会分开。除此之外,音频字时钟也不是从壁挂时间驱动的,并且它将具有自己的漂移。这意味着您无法获得样品或相位精度。 IEEE1394音频流和MPEG传输流层都通过向数据流发送嵌入了比特精度的时间戳来消除这一技巧。通过以太网,网络堆栈,Nagel算法和webSockets中的任何传输队列的组合,您显然无法获得这种奢侈。

10s到100ms可能更现实。

您可能希望了解Network Time Protocol用于解决基本类似问题的技巧。

答案 2 :(得分:0)

从所有客户(UTC)获取时间。找到客户的抵消。根据每个客户偏移量安排开始时间。