【问题标题】:Audio stream for multiple outputs (single producer, multi-consumer)多输出的音频流(单生产者,多消费者)
【发布时间】:2015-08-27 19:16:10
【问题描述】:

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

我已经成功编写了使用 WaveIn、BufferedWaveProvider 和 WaveOut 将麦克风输入循环到输出的代码。但是,当我尝试使用两个 WaveOut 实例读取一个 BufferedWaveProvider 时,这两个输出会产生这种奇怪的“交错”断断续续的声音。这是输出部分的代码sn-p;

    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 波流不能在单个生产者多个消费者的情况下使用,那么我相信我需要创建一个循环缓冲区,该缓冲区在读取时不会被清除,但只有在缓冲区已满和新数据时才会清除被推入。代码不会关心数据是否被读取,它只是不断填充缓冲区。这会是正确的方法吗?

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

【问题讨论】:

    标签: c# naudio producer-consumer


    【解决方案1】:

    如果您只是从麦克风读取并希望两个 WaveOut 播放它,那么简单的选择是创建两个 BufferedWaveProviders,每个 WaveOut 一个,然后当接收到音频时,将其发送到两者。

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

    不幸的是,没有简单的方法来同步,除非同时启动和停止两个播放器。

    有一些更高级的方法可以尝试将音频流拆分给两个阅读器,但可能会出现复杂情况,尤其是如果两个阅读器无法以大致相同的速度阅读。

    【讨论】:

    • 感谢您的回复,您的图书馆非常有帮助。这可能是一个“菜鸟”问题,但是否可以使用不同的 waveOut 实例多次读取相同的流?所以就像某个 waveOut 可以在需要时跳入和跳出流?
    • 不是同时播放,但如果一次只播放一个 waveOut,您也许可以让它工作
    猜你喜欢
    • 2017-02-24
    • 2015-04-05
    • 2011-03-12
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多