接收来自多个来源的音频数据并将它们合并到一个wave文件

问题描述:

我使用C#和DirectSound录制音频并通过本地网络将其发送到另一台接收数据并将其保存到波形文件的计算机。接收来自多个来源的音频数据并将它们合并到一个wave文件

我使用类似code for recording和类似的for saving波文件(使用NAudio)。

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

我试图记录两个独立的波形文件,每个客户端一个,然后将它们合并在一起。但是,我的天真方法不提供任何同步手段。生成的波形文件长度不同至少5秒,无法适当合并。

所以,这里是我的问题:

1)我如何可以从网络接收到的音频字节并将其保存到一个波形文件中这样的方式生成的文件播放音频在正确的时间?

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

那么,我怎样才能在适当的时间,100秒内同步这95秒的音频?

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

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

+0

你需要时间x在所有发件人上都一样吗?即它们是否应该具有相同的时基? – thalm 2012-05-06 16:37:41

+0

如果您发出巨大的噪音,我希望它同时显示在所有录音中。 – 2012-05-08 00:19:05

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

+0

@aleph_null所以,你会抛弃25的声望,而不是接受答案,让充分的赏金获得回报? – 2012-05-09 00:17:21

+0

不,我会有一个非常忙碌的一天,记得在截止日期之前选择一个答案......然后很难选择答案,因为它们都是一样的! – 2012-05-09 01:05:39

+0

非常感谢你和Vinnie Falco。 – 2012-05-09 01:13:16

如果您想同步来自多个来源的音频,则需要在接收端缓冲数据。除非您至少有来自每个参与源的BUFFERSIZE采样,否则不要编写或播放任何音频数据。您必须根据网络延迟调整BUFFERSIZE。

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

+0

这种方法的问题在于,它只有在所有程序都以完全相同的速率发送音频时才能正常工作。例如,我使用的一个音频传输设备是android,并且在录制音频数据包之间往往会有一个很小的延迟。因此,记录100秒会产生95秒的音频。所以,音频将不同步。如果我需要澄清,请告诉我。 – 2012-05-06 02:47:02

+0

不,缓冲数据专门解决了以不同速率发送音频的问题。只要缓冲区足够大以补偿最快和最慢信号源之间的传输速率差异,您就可以。 – 2012-05-06 15:57:51

+0

@VinnieFalco是对的。网络连接需要保持缓冲区队列的加满,而音频播放器以恒定速率清空它们。你付出的代价是额外的延迟,但没有多少选择。 – 2012-05-07 14:11:07