请教:Naudio中的 waveout(WasapiOut ),单路回放正常,多路并发播放时声音会失真,求解?

我使用 naudio 进行网络语音传输。接收一个点的声音回放正常,如果接收多个机器发来的声音流,并不能正常全部回放,结果是嘈杂的声音,失真了,不知道为什么。难道 _BWP.AddSamples 这个函数调用时有什么问题吗?每个声音源需要一个独立的 waveout (WasapiOut )对象单独播放吗?

相关代码如下。

using NAudio.Wave;
using System.Net.Sockets;
using System.Threading;
using System.Net;

 //private WaveOut speaker;//音频输出
  private WasapiOut speaker;//音频输出
  private BufferedWaveProvider _BWP;//接收声音缓冲

private void btn_receive_Click(object sender, EventArgs e)
        {
        speaker = new WasapiOut(NAudio.CoreAudioApi.AudioClientShareMode.Shared, 10);               
        WaveFormat wf = new WaveFormat(waverate, wavebit, wavechannel);
                _BWP = new BufferedWaveProvider(wf);
                speaker.Init(_BWP);
                if (receiver.recvMessageEvent == null)
                {
                    receiver.recvMessageEvent += new Action<byte[]>(receive_sound);
                }

                receiver.Start();//开始接收数据
    }

private void receive_sound(byte[] obj)
        {
            _BWP.AddSamples(obj, 0, obj.Length);//添加到待播放缓存中            
        }
        

在接收到多个机器发来的声音流并播放时,会产生声音交叉和混杂等问题。这可能是因为你使用的是同一个音频输出对象 speaker 和缓存对象 _BWP,当多个声音源的数据被写入到同一个缓存中并输出到同一个音频输出设备时,可能会出现混淆的声音。

一种解决方法是为每个声音源创建一个独立的音频输出对象 speaker 和缓存对象 _BWP,这样可以避免声音交叉和混杂的问题。每个缓存对象都可以通过调用 AddSamples 方法向对应的音频输出对象输出声音数据。

另外,对于网络传输的音频数据,为了避免数据包丢失或乱序等问题,建议使用可靠传输协议(如 TCP)或加入音频数据包的序号,以便在接收时进行重组和校验,保证数据的正确性。