【发布时间】: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