代码之家  ›  专栏  ›  技术社区  ›  sharkin

通过网络同步音频

  •  39
  • sharkin  · 技术社区  · 14 年前

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

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

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

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

    http://www.sonos.com

    http://netchorus.com/

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

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

    5 回复  |  直到 14 年前
        1
  •  30
  •   Kevin Panko Matthew Woodard    14 年前

    瑞安·巴雷特把他的发现写在 his blog .

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

    说真的,不过,只有一个 p4sync的诀窍,就是这样 使用NTP。一台主机充当p4sync 服务器。其他p4sync客户端 使系统时钟与 服务器时钟,使用sntp。当 服务器开始播放一首歌,它 记录时间,精确到毫秒。 然后客户机检索 时间戳,计算差异 从现在起 时间戳,并向前搜索 进入歌曲。

        2
  •  10
  •   Steve Rowe    14 年前

    看看报纸 An Internet Protocol Sound System 作者:微软研究院的汤姆·布兰克。他解决了你正在处理的确切问题。他的解决方案包括跨机器同步时钟,并使用时间戳让它们在同一时间播放。这种方法的缺点是延迟。要使所有时钟同步,需要在网络上的最大延迟处标记时间。

        3
  •  9
  •   Andrew McGregor    14 年前

    困难的问题,但有可能。

    使用NTP或 tictoc 让你自己得到一个同步时钟与已知的速率在您的系统的时间来源。

    同时,让一个估计器运行在你的声音时钟的速率上;通常的方法是用正在播放的同一个声音设备进行录制,在一个预先加载了一个神奇数字的缓冲区中进行录制,并通过同步时钟(或vice vERSA,看看在同步时钟上进行已知数量的采样需要多长时间)。你需要继续这样做,时钟将相对网络时间漂移。

    所以现在你知道了你的声卡时钟每秒需要输出多少个样本来匹配同步时钟的速率。因此,然后按该速率对从网络接收到的样本进行插值,如果需要从上一个缓冲区的位置补上或退回一点,则加上或减去一个校正。您将需要非常小心地进行这种插值,这样就不会引入音频伪影;下面是示例代码 here 对于你需要的算法,但在你开始加速之前,它将是相当多的阅读。

    当然,如果你的音源是现场录制的,你必须在发送前测量声卡的采样率并插入到网络时间采样中。

        4
  •  6
  •   Kevin Panko Matthew Woodard    13 年前

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

    更大的问题是声音传播需要相当长的时间。10米的距离差已经是30米的延迟——足以搞砸声音定位。加倍,你就会进入讨厌的回声区。专业的音频设置实际上有目的地引入延迟,使用更多的高音和混响播放,以避免不和谐的回声,使听众疲惫不堪。

        5
  •  0
  •   Kevin Panko Matthew Woodard    13 年前

    “……只要它被人类的听众认为是同步的”——很难做到,因为耳朵比眼睛更不宽容。尤其是如果你想在无线网络上做这件事。

    我将首先试验基于网络的技术,远程控制的flash音频播放器 通过javascript的服务器。

    如果结果不好,那么我会尝试使用python(与pygame一起)之类的工具来获得更多的控制。

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

    如果没有什么令人满意的消息,我会来重新访问这篇文章,并阅读一位专业的音频编程大师所写的一些有意义的文章,如果我的生计有赖于此,那么最终可能会为商业netchorus应用程序或类似的应用程序支付14英镑。