郝人(好人) 2021-12-08 21:09 采纳率: 0%
浏览 53

请教: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);//添加到待播放缓存中            
        }
        

  • 写回答

1条回答 默认 最新

  • 不咕鸟会咕咕 2023-02-19 19:23
    关注

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

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

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

    评论

报告相同问题?

问题事件

  • 创建了问题 12月8日

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容