C# 多输出音频流(单生产者、多消费者)

C# 多输出音频流(单生产者、多消费者),c#,naudio,producer-consumer,C#,Naudio,Producer Consumer,我试图将单个声源传播到多个输出(例如,一个麦克风输入到多个声卡或声道)。输出不必同步(可以接受几毫秒的延迟),但如果可以同步就好了 我已经成功地编写了使用WaveIn、BufferedWaveProvider和WaveOut将麦克风输入循环到输出的代码。然而,当我尝试读取一个BufferedWaveProvider和两个WaveOut实例时,两个输出会产生这种奇怪的“交错”起伏声音。下面是输出部分的代码片段 private void CreateWaveOutDevice() {

我试图将单个声源传播到多个输出(例如,一个麦克风输入到多个声卡或声道)。输出不必同步(可以接受几毫秒的延迟),但如果可以同步就好了

我已经成功地编写了使用WaveIn、BufferedWaveProvider和WaveOut将麦克风输入循环到输出的代码。然而,当我尝试读取一个BufferedWaveProvider和两个WaveOut实例时,两个输出会产生这种奇怪的“交错”起伏声音。下面是输出部分的代码片段

    private void CreateWaveOutDevice()
    {
        waveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
        waveOut = new WaveOut();
        waveOut.DeviceNumber = 0;  //Sound card 1
        waveOut.DesiredLatency = 100;
        waveOut.Init(waveProvider);
        waveOut.PlaybackStopped += wavePlayer_PlaybackStopped;

        waveOut2 = new WaveOut();
        waveOut2.DeviceNumber = 1;  //Sound card 2
        waveOut2.DesiredLatency = 100;
        waveOut2.Init(waveProvider);
        waveOut2.PlaybackStopped += wavePlayer_PlaybackStopped;

        waveOut.Play();
        waveOut2.Play();
    }
我认为发生这种情况的原因是,当读取waveProvider循环缓冲区时,数据被删除,因此两种读取方法正在为数据“斗争”,从而导致声音起伏

所以我真的有两个问题; 1.)我看到Naudio库包含许多类型的waveStreams(RawSourceWaveStream特别有趣),但是,我找不到一个好的示例,说明如何使用多个waveOut方法读取单个流。我也无法使用具有多个输出的waveStream创建工作代码。有人熟悉waveStreams并且知道这是否是可以做到的吗

2.)如果Naudio波流不能用于单生产者多消费者的情况,则我认为我需要制作一个循环缓冲区,该缓冲区在读取时不会被清除,但只有在缓冲区已满且新数据被推入时才会被清除。代码不会在意数据是否被读取,它只是不断填充缓冲区。这是正确的方法吗


我已经花了好几天的时间搜索,所以希望这还没有被问到。感谢阅读。

如果您只是从麦克风上阅读,需要两个WaveOut播放,那么简单的选择是创建两个BufferedWaveProviders,每个WaveOut一个,然后在收到音频时,将其发送给两个

同样,如果从一个音频文件播放到两个声卡,最简单的方法是使用两个读卡器对象并分别启动它们

不幸的是,除了同时启动和停止两个玩家之外,没有简单的同步方法


有几种更高级的方法可以尝试将音频流分割为两个读者,但可能会有一些复杂情况,特别是当两个读者不能以大致相同的速度阅读时。

谢谢您的回复,您的库非常有用。这可能是一个“noob”问题,但是否可以使用不同的waveOut实例多次读取同一个流?因此,这就好像一个特定的waveOut可以在需要的时候跳入或跳出一条流?不是同时跳入或跳出,但如果一次只播放一个waveOut,您就可以让它工作