多输出的音频流(单一制作人,多用户)

时间:2015-06-11 21:35:33

标签: c# naudio producer-consumer

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

我已成功编写了使用WaveIn,BufferedWaveProvider和WaveOut将麦克风输入循环到输出的代码。然而,当我尝试用两个WaveOut实例读取一个BufferedWaveProvider时,这两个输出创建了这个奇怪的交错'不稳定的声音。这是输出部分的代码片段;

    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库包含许多类型的waveStream(RawSourceWaveStream特别有趣)但是,我一直无法找到如何使用多个waveOut方法读取单个流的好例子。我也无法使用具有多个输出的waveStream创建工作代码。是否有人熟悉waveStreams并知道这是否可以做到?

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

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

1 个答案:

答案 0 :(得分:0)

如果您只是从麦克风上读取并想要两个WaveOut来播放它,那么简单的选项是创建两个BufferedWaveProviders,每个WaveOut一个,然后收到音频时,将它发送给两个。

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

遗憾的是,没有简单的同步方法,没有同时启动和停止两个玩家。

有一些更先进的方法可以尝试将音频流分割为两个读卡器,但如果两个读卡器无法以大致相同的速率读取,则可能会出现并发症。