通过网络同步音频

sha*_*kin 42 algorithm audio streaming synchronization

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

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

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

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

http://www.sonos.com

http://netchorus.com/

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

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

Kev*_*nko 31

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

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

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

  • +2,如果可以的话,这种材料正是我所追求的,谢谢! (2认同)

And*_*gor 10

难的问题,但可能.

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

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

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

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


Ste*_*owe 10

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


Ant*_*sma 6

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

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