网络音频同步

45

我正在设计一款可以在网络上任意流式传输音频的客户端/服务器音频系统。一个中央服务器泵出一个音频流,x个客户端接收音频数据并播放它。到目前为止,没有什么魔法,我甚至已经用VLC媒体播放器原装实现了这种情况。

然而,棘手的部分似乎是同步音频播放,以便所有客户端都处于可听状态(实际延迟可以允许,只要人类听众感知为同步即可)。

我的问题是是否有任何已知的方法或算法可用于解决这种类型的同步问题(视频可能以相同的方式解决)。 我最初的想法集中在在物理机器之间同步时钟,从而创建一个虚拟的“主计时器”,并将音频数据包对其进行对齐。

已经解决该问题的一些产品(但仍不足以满足我的整体用例):

http://www.sonos.com

http://netchorus.com/

欢迎提供任何指针。 谢谢。

PS:这个相关问题似乎很久以前就消失了。


与什么同步?您是指去抖动还是同步不同的通道或与视频同步或其他? - KillianDS
8
让两个客户端同步播放完全相同的音频,就像它们是连接到同一音响系统的两个扬声器一样。 - sharkin
嘿,你知道如何在Android中使用p4sync吗? - Kaushal28
嘿,请告诉我,你最终使用了什么来同步媒体?我正在Android上的同一个项目中。谢谢。 - Kaushal28
5个回答

31

Ryan Barrett 在他的博客中详细介绍了他的研究成果。

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

实际上,p4sync 只有一个技巧,那就是它如何使用 NTP。一台主机作为 p4sync 服务器。其他 p4sync 客户端使用 SNTP 将其系统时钟与服务器时钟同步。当服务器开始播放歌曲时,它会记录时间,精确到毫秒。然后客户端检索该时间戳,计算当前时间与该时间戳之间的差异,并向前跳转相应的时间进行播放。


2
如果可以的话,我会给你加2分。这种材料正是我需要的,谢谢! - sharkin
1
如何在Android中添加这个库? - Kaushal28

10

虽然有些困难,但是这是可行的。

使用NTP或tictoc,获取一个同步的时钟,并以你的系统时间源为基准确定它的速率。

同时,保持一个估算器运行,以便了解音频时钟的速率;通常的做法是使用相同的音频设备进行录制,录制一个预加载了魔数的缓冲区,并使用同步的时钟测量声卡在一段已知时间内达到的位置(或者反过来,在同步的时钟上测量执行已知数量的样本所需的时间)。需要不断这样做,因为时钟会与网络时间发生漂移。

现在你知道你的声卡时钟每秒需要输出多少样本以匹配同步时钟的速率。因此,你可以使用该速率插值从网络接收到的样本,再加上修正(如果需要)以补偿上次缓冲区中达到的位置。在进行这种插值时,你需要非常小心,以避免引入音频伪像;这里有例子代码here提供所需的算法,但要掌握这个还需要阅读相当多的内容。

如果你的源是一个实时录音,那么在发送之前必须测量该声卡的采样率,并将其插值为网络时间样本。


10

请查看微软研究员Tom Blank的论文《互联网协议声音系统》,他解决了你正在处理的问题。他的解决方案涉及跨机器同步时钟,并使用时间戳让它们同时播放。这种方法的缺点是延迟。为了将所有时钟同步,需要在网络上最大延迟的位置标记时间。


7
根据场馆的大小和形状,让一切同步起来是易如反掌的,但让音效正确则是一门艺术,如果可能的话。从技术角度来看,最困难的部分是找出你的同步时间轴到实际音频输出的延迟。拥有相同的硬件和低延迟软件框架(ASIO、JACK)肯定会在这方面有所帮助,校准也是如此。可以提前或主动进行校准。否则,就只能通过将时间轴与NTP同步,并使用闭环反馈来同步输出到协商好的时间轴。
更大的问题是声音需要相当长的时间传播。10米的距离差已经有30毫秒的延迟-足以破坏声音定位。将其加倍后,你就进入了恼人的回声领域。专业的音频设置实际上会故意引入延迟,使用更多的高音扬声器并玩弄混响,以避免听众感到厌倦的回声嘈杂声。

如果您成功让不同的计算机持续同步,那么引入延迟(以及它们附加扬声器的延迟)将是微不足道的。 - puk
引入延迟确实很简单,但如果听取位置不是固定的点,则确定延迟时间是困难的。 - Ants Aasma
是的,我同意,如果它是一个固定的位置,你可以尝试不同的值。但如果是移动的人或多个人,最好不要尝试。 - puk

0
"

只要被人类听众感知到是同步的,就可以了。" - 这很难做到,因为耳朵比眼睛更挑剔。特别是如果你想在无线网络上实现这个。

我会先尝试使用基于Web的技术,通过Javascript远程控制Flash音频播放器。

如果效果不佳,那么我会尝试使用像Python(带有Pygame)这样的工具来获得更多的控制权。

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

如果没有什么满意的结果,我会回来重新阅读专家音频编程大师的建议,并且如果我的生计依赖于此,最终可能会花费14英镑购买商业NetChorus应用程序或类似产品。

"

感谢您的回复。正如所提到的,现有产品似乎可以令人满意地解决问题,但它们在我特定用例的其他方面存在不足。 - sharkin
我很好奇,你在计划什么? - zaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接