我编写了代码,使用3个WaveInEvent实例从3个USB麦克风中录制麦克风。
waveIn.DataAvailable += OnDataAvailable;
waveIn.RecordingStopped += OnRecordingStopped;
waveIn.StartRecording();
waveIn2.DataAvailable += OnDataAvailable2;
waveIn2.RecordingStopped += OnRecordingStopped;
waveIn2.StartRecording();
在我的OnDataAvailable中,除了写入wav文件之外我什么都没做。
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
writer.WriteData(e.Buffer, 0, e.BytesRecorded);
}
我尝试了操作缓冲区大小,但没有真正解决延迟问题。我如何测试这个是我把麦克风放在彼此旁边并记录,如果我从这些数据运行互相关,理想情况下我应该得到~0样本滞后。
如果我可以“同时”从多个麦克风获取所有信号,并且不同麦克风之间没有延迟,那将是理想的选择。但是,我注意到不同麦克风之间的样本延迟很少。
我知道对于这种不需要/低延迟的应用程序,NAudio不是首选。我想知道是否可以通过使用WASAPI进一步减少不同USB麦克风之间的延迟,或者如果您建议使用其他库...
答案 0 :(得分:0)
根据我的经验,usb音频设备的延迟因设备类型,驱动程序甚至usb端口而异。因此,您可能需要调整延迟以获得完美契合度。
使用BufferedWaveProvider可以实现这一点。 在waveIn_DataAvailable中将数据写入其中。您可以调整每个缓冲波提供商的缓冲区大小,从而调整其延迟。也许你可以调整不同的延迟来同步你的麦克风。
当然,您可能会遇到与调整waveIn缓冲区相同的问题。在CLR中运行的语言(如C#)是非确定性的,时间不确定性为10-20ms,这可能使您的任务无法完成。