如何通过不可靠的网络同步媒体播放?

时间:2009-02-28 22:12:34

标签: networking synchronization audio-streaming

我希望我可以在一台计算机上播放音乐或视频,并让第二台计算机播放相同的媒体,同步。就像我一样,我可以同时听到两台电脑的扬声器,听起来也不好听。

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

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

编辑1

两台计算机是“播放”相同的媒体,还是“播放”媒体并将其传输到另一台媒体,对我来说无关紧要。

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

2 个答案:

答案 0 :(得分:6)

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

概述

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

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


混合手动网络同步

在没有持续人工干预的情况下,考虑其他延迟源的一种方法是将此方法与标准网络时钟同步协议相结合;第一次在新机器上运行协议时:

  1. 使用手动节拍式干预同步机器
  2. 使用网络时钟同步协议同步计算机
  3. 对于合唱中的每台机器,取两个同步的差异;这是每台机器的操作系统/驱动程序/声卡延迟,它们分别跟踪
  4. 现在每当网络骨干发生变化时,所有人都需要做的是使用网络时钟同步协议(#2)进行重新同步,并减去OS /驱动程序/声卡的延迟,从而无需人工干预(除非您更改操作系统/驱动程序/声卡。)


    自然模仿萤火虫同步

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

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

答案 1 :(得分:0)

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