我正在创建一个客户端/服务器音频系统,它可以通过网络任意传输音频。 一个中央服务器泵出音频流,x个客户端接收音频数据并播放它。 到目前为止还没有任何魔法需要,我甚至可以将这个场景与开箱即用的VLC媒体播放器配合使用。

然而,棘手的部分似乎是同步音频回放,以便所有客户端都处于可听同步状态(只要感知到人类听众同步,就可以允许实际等待时间)。

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

有些产品已经解决了这个问题(但对我的整体用例来说仍然不够):

http://www.sonos.com

http://netchorus.com/

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

PS: 这个相关的问题似乎很久以前就已经死了。

#1楼 票数:30 已采纳

Ryan Barrett在他的博客上写了他的发现。

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

但是说真的,p4sync只有一个技巧,那就是它如何使用NTP。 一台主机充当p4sync服务器。 其他p4sync客户端使用SNTP将其系统时钟与服务器的时钟同步。 当服务器开始播放歌曲时,它会将时间记录到毫秒级。 然后,客户端检索该时间戳,计算当前时间与该时间戳之间的差异,并向远处搜索该歌曲。

#2楼 票数:10

查看Microsoft Research的Tom Blank撰写的Internet Internet Protocol Sound System 他解决了你正在处理的确切问题。 他的解决方案包括在机器之间同步时钟并使用时间戳让它们同时播放。 这种方法的缺点是延迟。 要使所有时钟同步,需要在网络上以最大延迟标记时间。

#3楼 票数:9

难的问题,但可能。

使用NTP或tictoc为系统的时间源提供已知速率的同步时钟。

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

因此,现在您需要输出您需要输出的声卡时钟每秒的采样数以匹配同步时钟的速率。 因此,您然后以该速率插入从网络接收的样本,加上或减去校正,如果您需要从最后一个缓冲区的位置赶上或回落一点。 你需要非常小心地进行这种插值,使其不会引入音频伪像。 有示例代码在这里为你需要的算法,但它会是相当多的阅读你加快速度之前。

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

#4楼 票数:6

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

更大的问题是声音需要相当长的时间才能传播。 距离差10m已经是30ms的延迟 - 足以搞定声音定位。 加倍,你进入烦人的回声领域。 专业音频设置实际上有目的地引入延迟,使用更多数量的高频扬声器并播放混响,以避免让听众感到厌恶的回声。

#5楼 票数:0

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

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

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

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

如果没有任何令人满意的结果,我会来重新审视这篇文章,实际上是由专业的音频编程大师阅读一些明智的东西,如果我的生活依赖于它,可能最终会为商业NetChorus应用程序或类似东西分配14英镑。

  ask by sharkin translate from so

未解决问题?本站智能推荐:

1回复

在JavaScript中缓冲/同步多个音频流

这是我的问题的简要概述: 一间美术馆将设有一台中央计算机,以及三个独立的远程站点,例如距中央一英里。 每个站点都有一个音乐家。 中央计算机通过互联网向三位音乐家中的每位发送实时支持曲目,他们与之一起演奏,并被记录为实时流。 然后,三个流中的每个流都在画廊中播放,与背景音轨和其他音乐家
2回复

跨网络同步计数器

我有两台可以通过串行连接相互通信的计算机。 连接是通过无线网络进行的。 这两个系统之间的通信存在可变,变化的延迟。 在两个系统上,我都有一个计数器运行时间,该运行时间每毫秒增加1。 它们都在应用程序启动后立即启动。 假设每台计算机在不同的时间启动。 如何通过串行连接同步计数器,以使s
1回复

通过音频流传输ID3?

我已经用过Matt的AudioStreamer 我需要提取id3元数据并显示当前播放的歌曲。
1回复

使用python通过LAN记录,流式传输和接收音频

我正在研究在Windows上使用python 2.7编写一个非常简单的基于LAN的家庭监控系统。 我家周围有许多计算机,每台计算机都带有一个USB网络摄像头。 相机内置了麦克风。 我正在寻找最好的方法来捕获和流式传输网络上的音频和视频,然后接收和查看/收听它。 我猜想我将不得不使用PyA
1回复

尝试通过TCP流式传输2路音频?

我正在尝试制作一个视频会议应用程序(用c#编写),该应用程序将允许2个用户使用TCP进行视频会议。 此外,用户可以单独发短信。 目前,我的视频流正常工作,但音频尚未工作。 我不确定如何访问麦克风,如何使用TCP进行流传输,然后在其他用户的扬声器上播放它,因为我对c#还是比较陌生,而对于使用
1回复

如何在网络上连续流式传输音频

我正在尝试制作一个网络应用程序,该应用程序将实时连续不断地传输音频,并且不会被延迟(除了几秒钟)。 理想情况下,我想直接从我的房子中流式传输,但是我不确定该怎么做,以及其他人如何通过转到URL来收听流式传输? 有了内容流式传输后,就可以轻松创建Web应用程序来播放内容了。 任何帮助,将
1回复

通过互联网将音频从位置1传输到位置2

所以我有点卡在这里。 我有一个广播电台,但我们可以移动。 所以我有一个带轮子的工作室。 问题是,我们有天线,但是我们总是必须将其放置在离工作室非常近的地方。 现在,我想制造一种设备,该设备可以将音频从混音器stream传输到互联网,并且可以被另一个网络中的另一个设备received
1回复

使用Java进行网络时间同步

我正在使用Java创建一个p2p音频-midi流应用程序(不幸的是),我正在寻找一种使用可靠的协议实现(例如NTP)在某些对等点(源)之间提供网络时间同步的方法,但是我找不到任何相关的库都可以使用。我自己也花了有限的时间来实现自己的目标。 那么,有谁知道使用Java,NTP或替代协议/方法/想