我希望我可以在一台计算机上播放音乐或视频,并让第二台计算机同步播放相同的媒体。例如,我可以同时听到两台计算机的扬声器的声音,这听起来并不好笑。
我想通过 Wi-Fi 来完成此操作,但 Wi-Fi 有点不可靠。
从算法上来说,解决这个问题的最佳方法是什么?
EDIT 1
无论两台计算机“播放”相同的媒体,还是一台计算机“播放”媒体并将其流式传输到另一台计算机,对我来说都不重要。
我确信这是一个容易处理的问题,因为我曾经看过 Wi-Fi 扬声器的演示。那是 5 年前的事了,所以我认为今天的技术应该会让这一切变得更容易。
(当我偶然发现这个问题时,我自己正在寻找一个可以执行此操作的应用程序,希望我不必自己编写一个应用程序。)
overview
您引入了一点缓冲区延迟,并使用网络时间同步协议来对齐流。也就是说,您将流分成数据包,并为每个数据包添加“稍后在时间 T 播放”的时间戳,其中 T 是例如未来 50-100 毫秒(如果网络出现故障,则更长)。您将本地网络上的数据包发送(或多播)到集群中的所有计算机。由于应用程序时钟同步,所有计算机将同时播放声音。
请注意,可能还有其他因素,例如操作系统/驱动程序/声卡延迟,这些因素可能必须考虑到时间同步协议中。如果您不太敏锐,同步协议可能就像一台计算机每秒发出蜂鸣声一样简单,再加上您按节拍的另一台计算机上的按键。这样做的优点是可以解决操作系统/驱动程序/声卡层的任何其他延迟来源,但缺点是如果时钟不同步,则需要手动干预。
混合手动网络同步
解决其他延迟来源而无需持续手动干预的一种方法是将此方法与标准网络时钟同步协议相结合;第一次在新机器上运行协议时:
- 通过手动节拍式干预使机器同步
- 使用网络时钟同步协议同步机器
- 对于合唱团中的每台机器,取不同之处两个同步的;这是每台机器的操作系统/驱动程序/声卡延迟,它们各自跟踪
现在,每当网络主干发生变化时,人们所需要做的就是使用网络时钟同步协议重新同步(#2
),并减去操作系统/驱动程序/声卡延迟,从而无需手动干预(除非您更改操作系统/驱动程序/声卡)。
模仿自然的萤火虫同步
如果您在安静的房间中执行此操作并且所有机器都有麦克风,您甚至不需要手动干预(#1
),因为您可以让它们全部遵循“萤火虫式”同步算法。自然界中许多种类的萤火虫都会同时眨眼。http://tinkerlog.com/2007/05/11/synchronizing-fireflies/描述了这些萤火虫使用的算法:“如果一只萤火虫接收到邻居萤火虫的闪光,它会稍微提前闪烁。”闪烁对应于嘟嘟声或嗡嗡声(通过声卡,而不是主板压电蜂鸣器!),看到对应于通过麦克风收听。
由于声速,这在非常大的房间距离上可能有点尴尬,但我怀疑这会是一个问题(如果是这样,请降低蜂鸣声的频率)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)