从多个源接收音频数据并将它们合并到波形文件中
本文关键字:合并 波形 文件 数据 音频 | 更新日期: 2023-09-27 18:31:53
我正在使用C#和DirectSound录制音频,并通过本地网络将其发送到另一台接收数据并将其保存到波形文件中的计算机。
我使用类似的代码进行录制,使用类似的代码保存波形文件(使用 NAudio)。
将所有接收的字节保存到波形文件中是有效的。但是,我想从多台计算机接收音频并将其合并到单个波形文件中。
我尝试录制两个单独的 wave 文件,每个客户端一个,然后将它们合并在一起。但是,我幼稚的方法不提供任何同步方法。生成的波形文件的长度至少相差 5 秒,并且无法适当合并。
所以,这是我的问题:
1) 如何获取从网络接收的音频字节并将它们保存到波形文件中,以便生成的文件在正确的时间播放音频?
例如,我录制100秒的音频并通过网络发送。但是,实际上只记录了 95 秒的音频字节。缺少 5 秒是由于我发送数据包时发生的小延迟的累积造成的。
那么,如何将这 95 秒的音频同步到在正确的时间(100 秒)播放呢?
2) 如何混合从多个客户端接收的音频字节,以获得同步播放所有客户端音频的单个波形文件?
如果我需要澄清我的问题,请告诉我。我感谢任何帮助!
您需要在参与计算机上进行高精度时间同步(以及已发送数据包上的时间戳)。 为了最大程度地减少时钟漂移,您可以按预定的时间间隔重新同步(不太首选)或在计算机中安装更高质量的硬件时钟(首选)。 如果这些机器位于本地网络上,将一台计算机设置为NTP服务器,将另一台计算机设置为客户端将产生足够同步的时钟(即,在0.000001秒内或更好)。
同步来自多个源的音频,则需要在接收端缓冲数据。不要写入或播放任何音频数据,直到您至少从每个参与源获得 BUFFERSIZE 样本。您必须根据网络延迟调整缓冲区大小。
您可以使用两个线程执行此操作,一个线程用于写入或播放音频数据,另一个用于缓冲传入的流。从每个音频源接收到 BUFFERSIZE 样本后,接收线程将所有数据传递给另一个线程进行写入或播放。通常总是大多数流具有超过 BUFFERSIZE 的样本。你必须保留这些剩菜,以备下次填满。