2

我正在使用 C# 和 DirectSound 录制音频并通过本地网络将其发送到另一台接收数据并将其保存到波形文件中的计算机。

我使用类似的代码进行录制,并使用类似的代码保存波形文件(使用 NAudio)。

将所有接收到的字节保存到波形文件中。但是,我想从多台计算机接收音频并将其合并为一个波形文件。

我尝试录制两个单独的波形文件,每个客户端一个,然后将它们合并在一起。但是,我的幼稚方法没有提供任何同步方式。生成的波形文件在长度上至少相差 5 秒,并且无法适当地合并。

所以,这是我的问题:

1)如何获取从网络接收的音频字节并将它们保存到波形文件中,以便生成的文件在正确的时间播放音频?

例如,我录制了 100 秒的音频并通过网络发送。但是,实际上只记录了 95 秒的音频字节。丢失的 5 秒是由于我发送数据包时发生的小延迟累积造成的。

那么,如何在 100 秒内将这 95 秒的音频同步到正确的时间播放?

2)如何混合从多个客户端接收到的音频字节以获得同步播放所有客户端音频的单个波形文件?

如果我需要澄清我的问题,请告诉我。我感谢任何帮助!

4

2 回答 2

3

您需要参与计算机上的高精度时间同步(加上发送数据包的时间戳)。为了最大限度地减少时钟漂移,您可以按预定的时间间隔重新同步(不太推荐)或在机器中安装更高质量的硬件时钟(推荐)。如果这些机器位于本地网络上,则将其中一台设置为 NTP 服务器,另一台设置为客户端将产生足够同步的时钟(即,彼此之间的时钟在 0.000001 秒内或更好)。

于 2012-05-06T05:26:16.090 回答
2

如果要同步来自多个源的音频,则需要在接收端缓冲数据。在您从每个参与的源中获得至少 BUFERSIZE 样本之前,不要编写或播放任何音频数据。您必须根据网络延迟调整 BUFFERSIZE。

您可以使用两个线程来执行此操作,一个用于写入或播放音频数据,另一个用于缓冲传入的流。当从每个音频源接收到BUFFERSIZE 样本时,接收线程将所有数据传递给另一个线程进行写入或播放。通常情况下,大多数流都有超过 BUFFERSIZE 个样本。您将不得不保留这些剩菜以备下次填充。

于 2012-05-02T15:43:28.157 回答