我想使用c / c ++脚本将公共触发信号在两台不同的计算机上同步音频和录音。预计延迟不应超过1毫秒。
检索信号然后启动脚本并不是真正的问题,延迟非常微不足道(几微秒)。
目前,我陷入平均延迟(在播放开始和记录开始之间)约20ms,偏差非常重要(5到10 ms)。 计算机在Linux上运行,我正在使用 aplay 和来自 alsa-utils 的 arecord (使用system()命令直接从代码启动)。
有人有一个好主意或经验来减少或控制两个音频接口之间的延迟吗?
在我看来,应该有一种方法来初始化接口(速率,输出格式......),并且对于播放设备,将数据预加载到音频缓冲区中,然后在接收到信号时开始播放。 / p>
由于
答案 0 :(得分: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