在不同的计算机上同步播放和录制

Posted

技术标签:

【中文标题】在不同的计算机上同步播放和录制【英文标题】:Sync playback and recording on different computers 【发布时间】:2017-04-22 00:58:51 【问题描述】:

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

检索信号然后启动脚本并不是真正的问题,延迟非常小(几微秒)。

目前,我陷入了大约 20 毫秒的平均延迟(从播放开始到记录开始之间),并且偏差非常重要(5 到 10 毫秒)。 计算机在 Linux 上运行,我正在使用 alsa-utils 中的 aplayarecord(使用 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

【讨论】:

以上是关于在不同的计算机上同步播放和录制的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioPlayer 在模拟器中播放录制的音频,但不在手机上

录制和播放从麦克风录制的音频流

在网页上录制、保存和播放保存的声音文件

工作和家庭计算机上的 Mysql 同步

c#/.NET - 录制当前正在播放的音频

如何在 Java 中同步 TargetDataLine 和 SourceDataLine(同步音频录制和播放)