Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从多个源接收音频数据,并将其合并到wave文件中_C#_Wav_Audio Recording_Naudio_Directsound - Fatal编程技术网

C# 从多个源接收音频数据,并将其合并到wave文件中

C# 从多个源接收音频数据,并将其合并到wave文件中,c#,wav,audio-recording,naudio,directsound,C#,Wav,Audio Recording,Naudio,Directsound,我使用C#和DirectSound来录制音频,并通过本地网络将其发送到另一台计算机,该计算机接收数据并将其保存到wave文件中 我使用了相似的wave文件(使用NAudio) 将所有接收到的字节保存到wave文件中是可行的。但是,我想从多台计算机接收音频,并将其合并到一个wave文件中 我试着记录两个单独的wave文件,每个客户端一个,然后将它们合并在一起。然而,我的天真方法没有提供任何同步方法。生成的波形文件长度至少相差5秒,因此无法适当合并 因此,以下是我的问题: 1) 如何将从网络接收到的

我使用C#和DirectSound来录制音频,并通过本地网络将其发送到另一台计算机,该计算机接收数据并将其保存到wave文件中

我使用了相似的wave文件(使用NAudio)

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

我试着记录两个单独的wave文件,每个客户端一个,然后将它们合并在一起。然而,我的天真方法没有提供任何同步方法。生成的波形文件长度至少相差5秒,因此无法适当合并

因此,以下是我的问题:

1) 如何将从网络接收到的音频字节保存到wave文件中,以便生成的文件在正确的时间播放音频

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

那么,我如何在100秒的时间内,在正确的时间同步95秒的音频播放呢

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


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

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


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

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

这种方法的问题是,只有当所有程序都以完全相同的速率发送音频时,它才会起作用。例如,我正在使用的一个音频传输设备是安卓系统,在录制音频数据包之间往往会有微小的延迟。因此,录制100秒会产生95秒的音频。因此,音频将不同步。如果需要澄清,请告诉我。不,缓冲数据专门解决了音频以不同速率发送的问题。只要缓冲区足够大,足以补偿最快和最慢源之间的传输速率差异,您就可以了。@VinnieFalco是对的。网络连接需要在音频播放器以恒定速率清空缓冲区队列的同时保持缓冲区队列已满。你付出的代价是额外的延迟,但别无选择。但是,假设我有一台电脑和一台安卓设备在同一个房间里,在录制100秒后,我会非常大声地鼓掌。电脑记录99秒的音频,而安卓设备记录95秒的音频。(我编造了这些数字,但它们说明了发生了什么)。每次录制时,clap显示间隔为4秒。如果希望音频流在时间上同步混合在一起,请使用可靠来源的绝对时间标记每个流的开始。您仍然需要缓冲,但除了最快和最慢的源之间的差异外,还需要考虑源之间的开始时间差异。当您将流混合在一起时,您必须注意时间同步。是否需要时间x在所有发送方上都相同?i、 e.他们应该有相同的时基吗?如果你大声喧哗,我希望它同时出现在所有录音中。@aleph_null那么,你要放弃25个名声而不是接受答案,让全部奖金得到奖励吗?不,我会很忙,记得在截止日期前选择一个答案。。。然后很难选择答案,因为它们都是一样的@虽然我不同意答案是一样的。时间戳是在对另一个答案进行了大量讨论之后才被提及的(那是在我发布这篇文章的几天后)。