Networking 如何在不可靠的网络上同步媒体播放?

Networking 如何在不可靠的网络上同步媒体播放?,networking,synchronization,audio-streaming,Networking,Synchronization,Audio Streaming,我希望我能在一台电脑上播放音乐或视频,并让另一台电脑播放相同的媒体,同步。就像在电影中一样,我可以同时听到两台电脑的扬声器,听起来一点也不好笑 我想通过Wi-Fi来做这件事,这有点不可靠 从算法上讲,解决这个问题的最佳方法是什么 编辑1 无论是两台计算机“播放”相同的媒体,还是一台计算机“播放”媒体并将其传输到另一台计算机,对我来说都无关紧要 我确信这是一个容易处理的问题,因为我曾经看过一个Wi-Fi扬声器的演示。那是5年多以前的事了,所以我认为这项技术今天应该会让它变得更容易。同步是相对于每个

我希望我能在一台电脑上播放音乐或视频,并让另一台电脑播放相同的媒体,同步。就像在电影中一样,我可以同时听到两台电脑的扬声器,听起来一点也不好笑

我想通过Wi-Fi来做这件事,这有点不可靠

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

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


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

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

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

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

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


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

  • 使用手动节拍式干预同步机器
  • 使用网络时钟同步协议同步机器
  • 对于合唱中的每台机器,取两个同步的差值;这是每台机器的操作系统/驱动程序/声卡延迟,它们都会跟踪这些延迟
  • 现在,每当网络主干发生变化时,只需使用网络时钟同步协议(
    #2
    )重新同步,并减去操作系统/驱动程序/声卡延迟,无需手动干预(除非您更改操作系统/驱动程序/声卡)


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


    由于音速的原因,在非常大的房间距离内,这可能有点尴尬,但我怀疑这是否会成为一个问题(如果是这样,请降低嘟嘟声的频率)。

    我很想知道为什么您要在两个电台上进行同步播放,而不是在一个电台上播放并分发信号@cdonner现在很多人都在用raspi做这件事,坦率地说,人们正从由笨重的遥控器控制的中央立体声系统转向分布式计算机。长话短说,这是站不住脚的。不幸的是,这个答案误解了OP的要求,因此与所提出的问题无关。(这里讨论的这种同步几乎可以肯定地包括我们的耳朵和大脑如何在空间中定位声音,因此改变这种“同步”可能会产生几乎移动声源的效果。)