使用NAudio库同时录制多个USB麦克风

时间:2014-01-26 15:25:04

标签: usb microphone naudio cross-correlation

我编写了代码,使用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麦克风之间的延迟,或者如果您建议使用其他库...

1 个答案:

答案 0 :(得分:0)

根据我的经验,usb音频设备的延迟因设备类型,驱动程序甚至usb端口而异。因此,您可能需要调整延迟以获得完美契合度。

使用BufferedWaveProvider可以实现这一点。 在waveIn_DataAvailable中将数据写入其中。您可以调整每个缓冲波提供商的缓冲区大小,从而调整其延迟。也许你可以调整不同的延迟来同步你的麦克风。

当然,您可能会遇到与调整waveIn缓冲区相同的问题。在CLR中运行的语言(如C#)是非确定性的,时间不确定性为10-20ms,这可能使您的任务无法完成。