多个输出的音频流(单生产者,多消费者)
Audio stream for multiple outputs (single producer, multi-consumer)
我正在尝试将单个声源传播到多个输出(例如一个麦克风输入到多个声卡或通道)。输出不必同步(几毫秒的延迟是可以接受的),但如果可以同步就更好了。
我已经成功编写了使用 WaveIn、BufferedWaveProvider 和 WaveOut 将麦克风输入循环到输出的代码。但是,当我尝试读取一个带有两个 WaveOut 实例的 BufferedWaveProvider 时,这两个输出会产生这种奇怪的 'interleaved' 断断续续的声音。这是输出部分的代码片段;
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 循环缓冲区时,数据被删除,所以两种读取方法 'fighting' 在数据上,导致声音断断续续。
所以我真的有两个问题;
1.) 我看到 Naudio 库包含许多类型的 waveStreams(RawSourceWaveStream 特别有趣)但是,我一直无法找到一个很好的例子来说明如何使用多个 waveOut 方法读取单个流。我也无法使用具有多个输出的 waveStream 创建工作代码。是否有人熟悉 waveStreams 并且知道这是否可以完成?
2.) 如果 Naudio 波形流不能用于单个生产者多个消费者的情况,那么我相信我需要制作一个循环缓冲区,该缓冲区在读取时不会被清除,但只有当缓冲区已满且新数据被推入。代码不会关心数据是否被读取它只是不断填充缓冲区。这是正确的方法吗?
我花了几天时间搜索,希望这个问题还没有被问到。感谢阅读。
如果您只是从麦克风读取数据并想要两个 WaveOut 来播放它,那么简单的选择是创建两个 BufferedWaveProvider,一个用于每个 WaveOut,然后在接收到音频时将其发送到两者。
同样,如果您从一个音频文件播放到两个声卡,最简单的方法是使用两个 reader 对象并分别启动它们。
遗憾的是,没有简单的同步方法,除非同时启动和停止两个玩家。
有一些更高级的方法可以尝试将音频流拆分为两个 reader,但可能会出现复杂情况,尤其是如果两个 reader 无法同时读取大致相同的比率。
我正在尝试将单个声源传播到多个输出(例如一个麦克风输入到多个声卡或通道)。输出不必同步(几毫秒的延迟是可以接受的),但如果可以同步就更好了。
我已经成功编写了使用 WaveIn、BufferedWaveProvider 和 WaveOut 将麦克风输入循环到输出的代码。但是,当我尝试读取一个带有两个 WaveOut 实例的 BufferedWaveProvider 时,这两个输出会产生这种奇怪的 'interleaved' 断断续续的声音。这是输出部分的代码片段;
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 循环缓冲区时,数据被删除,所以两种读取方法 'fighting' 在数据上,导致声音断断续续。
所以我真的有两个问题; 1.) 我看到 Naudio 库包含许多类型的 waveStreams(RawSourceWaveStream 特别有趣)但是,我一直无法找到一个很好的例子来说明如何使用多个 waveOut 方法读取单个流。我也无法使用具有多个输出的 waveStream 创建工作代码。是否有人熟悉 waveStreams 并且知道这是否可以完成?
2.) 如果 Naudio 波形流不能用于单个生产者多个消费者的情况,那么我相信我需要制作一个循环缓冲区,该缓冲区在读取时不会被清除,但只有当缓冲区已满且新数据被推入。代码不会关心数据是否被读取它只是不断填充缓冲区。这是正确的方法吗?
我花了几天时间搜索,希望这个问题还没有被问到。感谢阅读。
如果您只是从麦克风读取数据并想要两个 WaveOut 来播放它,那么简单的选择是创建两个 BufferedWaveProvider,一个用于每个 WaveOut,然后在接收到音频时将其发送到两者。
同样,如果您从一个音频文件播放到两个声卡,最简单的方法是使用两个 reader 对象并分别启动它们。
遗憾的是,没有简单的同步方法,除非同时启动和停止两个玩家。
有一些更高级的方法可以尝试将音频流拆分为两个 reader,但可能会出现复杂情况,尤其是如果两个 reader 无法同时读取大致相同的比率。