在不同的计算机上同步播放和录制
Posted
技术标签:
【中文标题】在不同的计算机上同步播放和录制【英文标题】:Sync playback and recording on different computers 【发布时间】:2017-04-22 00:58:51 【问题描述】:我想使用 c/c++ 脚本从公共触发信号同步两台不同计算机上的音频播放和录制。预计延迟不应超过 1 毫秒。
检索信号然后启动脚本并不是真正的问题,延迟非常小(几微秒)。
目前,我陷入了大约 20 毫秒的平均延迟(从播放开始到记录开始之间),并且偏差非常重要(5 到 10 毫秒)。 计算机在 Linux 上运行,我正在使用 alsa-utils 中的 aplay 和 arecord(使用 system() 命令直接从代码开始)。
是否有人有减少或控制两个音频接口之间延迟的好主意或经验?
在我看来,应该有一种方法来初始化两个接口(速率,输出格式,...),对于播放设备,将数据预加载到音频缓冲区中,然后在收到信号时开始播放。
谢谢
【问题讨论】:
音频同步是一件棘手的事情。也许你应该看看 JACK 而不是直接弄乱 alsa API。你绝对可以做一个JACK输出,在多台电脑上同步输出音频。 【参考方案1】:这是一项艰巨的任务,但在技术上也非常有趣。目前我能想到的最好方法是使用 RTT(往返时间)方法(假设您可以将音频设备的延迟控制到所需的范围内)。您可以在第一个系统上向第二个系统发出信号,第二个系统对此进行回复。第二个系统在预定义的时间量(可能是 100 毫秒,但取决于预期的延迟)后开始记录。当第一系统接收到响应时,它可以确定往返时间。然后,我们可以在预定义的延迟减去一半往返时间后开始播放 - 假设前进的时间与返回的时间相同。可以达到的精度取决于您用于信令的系统。
EMIT SIGNAL ON SYSTEM 1
RECEIVE SIGNAL ON SYSTEM 2
EMIT SIGNAL ON SYSTEM 2
RECEIVE SIGNAL ON SYSTEM 1
DETERMINE ROUND-TRIP-TIME
START ON SYSTEM 2 AFTER X ms
START ON SYSTEM 1 ASTER (X-RTT/2) ms
【讨论】:
以上是关于在不同的计算机上同步播放和录制的主要内容,如果未能解决你的问题,请参考以下文章