多个输出的音频流(单个制作者,多消费者)
本文关键字:制作者 消费者 单个 输出 音频流 | 更新日期: 2023-09-27 17:55:22
我正在尝试将单个声源传播到多个输出(例如一个麦克风输入到多个声卡或通道)。输出不必同步(几毫秒的延迟是可以接受的),但如果可以同步就好了。
我已经成功地编写了使用 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库包含许多类型的waveStreams(RawSourceWaveStream特别有趣)但是,我一直找不到如何使用多个waveOut方法读取单个流的好例子。我也无法使用具有多个输出的 waveStream 创建工作代码。有没有人熟悉waveStreams,知道这是否可以做到?
2.) 如果 Naudio 波形流不能在单个生产者多个消费者的情况下使用,那么我相信我需要创建一个循环缓冲区,该缓冲区在读取时不会清除,但只有在缓冲区已满并且新数据被推送时才会清除。代码不会关心数据是否被读取,它只是不断填充缓冲区。这是正确的方法吗?
我花了几天时间搜索,所以希望这还没有被问到。感谢您的阅读。
如果您只是从麦克风读取并希望两个 WaveOut 播放它,那么简单的选择是创建两个 BufferedWaveProviders,每个 WaveOut 一个,然后在收到音频时,将其发送给两者。
同样,如果您从音频文件播放到两个声卡,最简单的方法是使用两个阅读器对象并分别启动它们。
不幸的是,没有简单的同步方法,除了同时启动和停止两个玩家。
有一些更高级的方法可以尝试将音频流拆分为两个阅读器,但可能会很复杂,特别是如果两个阅读器无法以大致相同的速率阅读。