2016-12-07 84 views
2

我想通过使用c/C++脚本从共同的触发信号同步两台不同计算机上的音频回放和录制。预计的延迟不应超过1毫秒。在不同的计算机上同步回放和录制

检索信号然后启动脚本并不是真正的问题,延迟非常微不足道(几微秒)。目前,我被困在平均延迟(播放开始和记录开始之间)约20ms,偏差非常重要(5到10ms)。 计算机正在Linux上运行,我正在使用aplayarecord from alsa-utils(直接从使用system()命令的代码开始)。

有人有一个好主意或经验来减少或控制两个音频接口之间的延迟吗?

在我看来,应该有一种方法来初始化接口(速率,输出格式等),并且对于回放设备,将数据预加载到音频缓冲器中,然后在接收到信号时开始播放。

谢谢

+0

音频同步是一件棘手的事情。可能你应该看看JACK,而不是直接搞乱alsa API。您绝对可以制作单个JACK输出,这将在多台电脑上同步输出音频。 –

回答

0

这是一个艰难的,但技术上非常有趣。目前我能想到的最佳方法是使用RTT(往返时间)方法(假设您可以控制音频设备的延迟达到所需的程度)。您可以将第一个系统上的信号发送到第二个系统,第二个系统会回复该信号。第二个系统在预定义的时间量后开始记录(可能为100 ms,但取决于预期的延迟时间)。当拳头系统收到响应时,它可能会确定往返时间。然后,我们可以在预定义的延迟之后开始播放,减去半程往返时间 - 假设前进路线的时间与返回时间相同。可以实现的准确度取决于您用于信号传输的系统。

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 
相关问题