我希望我可以在一台计算机上播放音乐或视频,并让第二台计算机播放相同的媒体,同步.就像我一样,我可以同时听到两台电脑的扬声器,听起来也不好笑.
我想通过Wi-Fi做到这一点,这有点不可靠.
从算法上讲,解决这个问题的最佳方法是什么?
两台计算机是"播放"相同的媒体,还是一台"播放"媒体并将其传输到另一台,对我来说无关紧要.
我确信这是一个容易处理的问题,因为我曾经看过一个Wi-Fi扬声器的演示.那是5年多以前的事了,所以我认为技术今天应该变得更容易.
(我自己正在寻找一个这样做的应用程序,希望在我偶然发现这个问题时,我不必自己写一个.)
您引入了一些缓冲延迟,并使用网络时间同步协议来对齐流.也就是说,您将流分成数据包,并将每个数据包的时间戳记为"稍后在时间T播放",其中T例如将来为50-100ms(如果网络是毛刺,则更多).您将本地网络上的数据包发送(或多播)到合唱中的所有计算机.计算机将同时播放声音,因为应用程序时钟已同步.
请注意,可能还有其他因素,如OS /驱动程序/声卡延迟,这些因素可能必须考虑到时间同步协议中.如果你不太挑剔,同步协议可能就像一台计算机每秒发出一次嘟嘟声一样简单 - 再加上你在另一台计算机上敲击一个键.这具有考虑OS /驱动器/声卡层上的任何其他滞后源的优点,但是具有如果时钟变得不同步则需要手动干预的缺点.
在没有持续的人工干预的情况下,考虑其他延迟源的一种方法是将该方法与标准网络时钟同步协议相结合; 第一次在新机器上运行协议时:
通过手动节拍式干预来同步机器
使用网络时钟同步协议同步机器
对于合唱中的每台机器,取两个同步的差异 ; 这是每台机器的操作系统/驱动程序/声卡延迟,它们各自跟踪
现在,每当网络骨干发生变化时,所有人都需要做的是使用网络时钟同步协议(#2
)重新同步,并减去OS /驱动程序/声卡的延迟,从而无需手动干预(除非您更改操作系统/驱动程序/声卡).
如果你在一个安静的房间里这样做,并且所有机器都有麦克风,你甚至不需要手动干预(#1
),因为你可以让它们都遵循"萤火虫式"同步算法.自然界中的许多萤火虫都会齐声眨眼.http://tinkerlog.com/2007/05/11/synchronizing-fireflies/描述了这些萤火虫使用的算法:"如果萤火虫接收到邻居萤火虫的闪光,它会稍早闪烁." 闪烁对应于哔哔声或嗡嗡声(通过声卡,而不是主板压电蜂鸣器!),并且看到对应于通过麦克风收听.
由于声音的速度,这可能在非常大的房间距离上有点尴尬,但我怀疑这将是一个问题(如果是这样,降低哔哔声的速度).