2010-05-08 67 views
37

我正在设计客户端/服务器音频系统,可以通过网络任意流式传输音频。一台中央服务器输出一个音频流,x个客户端接收音频数据并播放。到目前为止,还没有魔术需要,我甚至有这种情况与VLC媒体播放器开箱即用。通过网络同步音频

但是,棘手的部分似乎是同步音频播放,以便所有客户端都可以听到同步(只要人们听到同步,实际延迟就可以被允许)。

我的问题是如果有任何已知的方法或算法用于这种类型的同步问题(视频可能以相同的方式解决)。我自己最初的想法是围绕同步物理机器之间的时钟,从而创建一个虚拟的“主定时器”,并以某种方式对齐音频数据包。

有些产品已经解决了这个问题(但仍然不是我的整体使用情况足够了):

http://www.sonos.com

http://netchorus.com/

任何指针是最欢迎的。 谢谢。

PS:This related question好像早就死了。

+0

与什么同步?你的意思是去抖或同步不同的频道或与视频同步或...? – KillianDS 2010-05-08 18:23:29

+8

@KillianDS:同步,以便两个客户端播放完全相同的音频,就像他们是连接到同一个音响系统的两个扬声器一样。 – sharkin 2010-05-08 19:16:06

+0

嘿你知道如何在Android中使用p4sync吗? – Kaushal28 2017-02-15 14:07:33

回答

28

Ryan Barrett在his blog上写下了他的发现。

他的解决方案涉及使用NTP作为一种方法来保持同步的所有时钟:

严重的是,虽然只有一个 招p4sync,那就是它 如何使用NTP。一台主机充当p4sync 服务器。其他p4sync客户端 使用SNTP将其系统时钟同步到 服务器的时钟。当 服务器开始播放歌曲时,它会将时间记录到毫秒。 客户端然后检索该时间戳,计算当前时间与该 时间戳之间的差值 ,并且将该远处的 查找到歌曲中。

+2

+2如果可以的话,这种材料正是我所追求的,谢谢! – sharkin 2010-05-08 19:09:18

+0

如何在android中添加这个提到的库? – Kaushal28 2017-02-15 14:18:18

0

“......只要它被人类听众认为是同步的” - 很难做到这一点,因为耳朵不如眼睛宽容。特别是如果你想通过无线网络来做到这一点。

我会首先尝试使用基于网络的技术,由服务器通过Javascript远程控制闪存音频播放器 。

如果这给了不好的结果,那么我会尝试通过使用类似python(与pygame)来获得更多的控制权。

如果正在取得进展,我还会尝试使用ChucK并尝试使用ALSA音频库进行一些低级编程。

如果没有什么令人满意的东西出来,我会来重温这篇文章,实际上读一些专业的音频编程专家明智的东西,如果我的生计依靠它,可能会最终为商业NetChorus应用程序分配14英镑,或者相似的东西。

+0

感谢您的回复。如前所述,现有产品似乎可以解决令人满意的问题,但是在我的特殊用例的其他部分却存在缺陷。 – sharkin 2010-05-08 18:08:49

+0

我很好奇,你打算做什么? – zaf 2010-05-08 18:18:24

9

困难的问题,但可能的。

使用NTP或tictoc为您自己提供一个已知速率的同步时钟,就系统时间源而言。

同时保持一个估计器运行在您的声音时钟的速率;这样做的常用方法是使用与播放相同的声音设备进行录制,通过预装了幻数的缓冲区录制声音,并查看声卡在同步时钟测量的时间内到达的位置(反之亦然,请参阅在同步时钟上执行已知数量的采样需要多长时间)。你需要继续这样做,时钟会相对于网络时间漂移。

因此,现在您可以确切知道您的声卡时钟每秒需要输出多少个样本以匹配同步时钟的速率。因此,您可以按照该速率对从网络接收的样本进行插值,如果您需要赶上或退回到最后一个缓冲区的位置,可以加或减修正。您将需要非常小心地进行插值,以避免引入音频失真;对于您需要的算法,有代码here的例子,但在开始加速之前,它会有相当多的读数。

如果您的源是实时录制,当然,您必须先测量该声卡的采样率并在发送之前插入网络时间采样。

9

查看微软研究院的Tom Blank的论文An Internet Protocol Sound System。他解决了你正在处理的确切问题。他的解决方案涉及在计算机之间同步时钟,并使用时间戳让它们各自同时播放。这种方法的缺点是延迟。要使所有时钟同步,需要在网络上以最大延迟时间戳记时间。

6

根据场地的大小和形状,让一切在同步是比较容易的部分,让一切声音正确的是一种艺术形式本身,如果可能的话。从技术方面来说,最困难的部分是找出从同步时间线到实际声音输出的延迟。具有相同的硬件和低延迟软件框架(ASIO,JACK)在这里肯定有帮助,校准也是如此。提前或主动。否则,它只是将时间线与NTP同步,并使用音频音调的闭环反馈来将输出与商定的时间线同步。

更大的问题是声音需要花费相当长的时间来传播。距离10米的距离已经有30毫秒的延迟 - 足以导致声音定位。加倍,你进入恼人的回声领域。专业音频设置实际上是有目的地引入延迟,使用更多数量的高音扬声器并与混响一起播放,以避免听众喧嚣的回声。

+0

如果您设法让不同的计算机连续同步,那么引入延迟(以及延迟其连接的扬声器)将变得微不足道。 – puk 2013-11-08 10:15:04

+0

引入延迟确实是微不足道的,如果聆听位置不是固定点,那么确定延迟应该很难。 – 2013-11-09 21:03:33

+0

是的,我同意,如果它是一个固定点,你可以测试不同的值。但是,如果它是一个移动的人,或者多个人,或许最好甚至不尝试 – puk 2013-11-09 23:26:53