6

我希望我可以在一台计算机上播放音乐或视频,并让另一台计算机同步播放相同的媒体。例如,我可以同时听到两台计算机的扬声器,这听起来并不好笑。

我想通过 Wi-Fi 执行此操作,这有点不可靠。

从算法上讲,解决这个问题的最佳方法是什么?

编辑 1

两台计算机是否“播放”相同的媒体,或者一台“播放”媒体并将其流式传输到另一台,对我来说并不重要。

我确信这是一个容易解决的问题,因为我曾经看过一个 Wi-Fi 扬声器的演示。那是 5 年多以前的事了,所以我认为今天的技术应该让它变得更容易。

4

2 回答 2

6

(当我偶然发现这个问题时,我自己正在寻找一个可以做到这一点的应用程序,希望我不必自己写一个。)

概述

您引入了一点缓冲延迟并使用网络时间同步协议来对齐流。也就是说,您将流拆分为数据包,并在每个数据包上加上“稍后在时间 T 播放”的时间戳,其中 T 例如未来 50-100 毫秒(如果网络出现故障,则更多)。您将本地网络上的数据包发送(或多播)到合唱中的所有计算机。由于应用程序时钟已同步,所有计算机将同时播放声音。

请注意,可能还有其他因素,例如操作系统/驱动程序/声卡延迟,可能必须考虑到时间同步协议中。如果你不是太挑剔,同步协议可能就像一台计算机每秒发出哔哔声一样简单——再加上你在节拍中敲击另一台计算机上的一个键。这具有在操作系统/驱动程序/声卡层考虑任何其他滞后源的优点,但具有如果时钟变得不同步则需要手动干预的缺点。


混合手动网络同步

解决其他延迟来源的一种方法,无需持续手动干预,就是将此方法与标准网络时钟同步协议相结合;第一次在新机器上运行协议时:

  1. 通过手动节拍式干预使机器同步
  2. 使用网络时钟同步协议同步机器
  3. 对于合唱中的每台机器,取两次同步的差值;这是每台机器的操作系统/驱动程序/声卡延迟,它们各自跟踪

现在,每当网络主干发生变化时,只需使用网络时钟同步协议 ( #2) 重新同步,并减去操作系统/驱动程序/声卡延迟,无需手动干预(除非您更改操作系统/驱动程序/声卡)。


自然模仿萤火虫同步

如果你在一个安静的房间里做这个并且所有的机器都有麦克风,你甚至不需要人工干预(#1),因为你可以让它们都遵循“萤火虫式”的同步算法。自然界中许多种类的萤火虫都会齐声闪烁。http://tinkerlog.com/2007/05/11/synchronizing-fireflies/描述了这些萤火虫使用的算法:“如果萤火虫收到邻居萤火虫的闪光,它会稍早闪烁。” 闪烁对应于哔哔声或蜂鸣声(通过声卡,而不是主板压电蜂鸣器!),看到对应于通过麦克风收听。

由于声速的原因,在非常大的房间距离上这可能有点尴尬,但我怀疑这会是一个问题(如果是这样,请降低哔哔声的速度)。

于 2011-06-29T02:19:49.593 回答
0

同步是相对于听者相对于每个扬声器的位置而言的。我认为网络的可靠性与这种同步的关系并不像音频流的内容那么重要。为了同步,您需要找到每个扬声器和听众之间的距离。找出每个值与最远说话者的值之间的差异。对于每 1.1 英尺的差异,将每个靠近的扬声器延迟 1 毫秒。这将确保音频流同时到达听众。这一切都假设一个开放区域,因为任何靠近您的场景都会产生音频波的反射并产生破坏性干扰。该区域内的物体也可能以较慢的速度传播声音,从而导致它们自己的声音延迟。

于 2009-02-28T22:29:38.233 回答