C# 带有Naudio和TCP流的断断续续音频。缓冲区已满异常

C# 带有Naudio和TCP流的断断续续音频。缓冲区已满异常,c#,tcp,naudio,C#,Tcp,Naudio,我正在尝试通过TCP连接使用Naudio传输音频。问题是音频听起来很不稳定。我相信这是因为当我尝试向bufferedwaveprovider添加样本时,出现了一个异常,称缓冲区已满 我已尝试增加缓冲区大小,但结果保持不变 -----客户端代码----- -----服务器代码------ public NAudio.Wave.WaveInEvent sourcestream=null; 公共TcpListener侦听器=新TcpListener(IPAddress.Any,8001); 公共TCP

我正在尝试通过TCP连接使用Naudio传输音频。问题是音频听起来很不稳定。我相信这是因为当我尝试向bufferedwaveprovider添加样本时,出现了一个异常,称缓冲区已满

我已尝试增加缓冲区大小,但结果保持不变

-----客户端代码-----

-----服务器代码------

public NAudio.Wave.WaveInEvent sourcestream=null;
公共TcpListener侦听器=新TcpListener(IPAddress.Any,8001);
公共TCP客户机;
公共网络;
公共表格1()
{
初始化组件();
sourcestream=new NAudio.Wave.WaveInEvent();
sourcestream.DeviceNumber=0;
sourcestream.WaveFormat=新的NAudio.Wave.WaveFormat(8000,16,1);
sourcestream.DataAvailable+=新的EventHandler(audioDataAvailable);
sourcestream.StartRecording();
}
公共客户机()
{
侦听器=新的TcpListener(IPAddress.Any,8001);
listener.Start();
client=listener.AcceptTcpClient();
ns=client.GetStream();
}
void audioDataAvailable(对象发送方,NAudio.Wave.WaveInEventArgs e)
{
尝试
{
如果(客户端已连接)
{
ns.写入(e.Buffer,0,e.Buffer.Length);
ns.Flush();
}
}
捕获(例外情况除外)
{            
这是我收到的确切错误


“System.InvalidOperationException:NAudio.Wave.BufferedWaveProvider.AddSamples(Byte[]Buffer,Int32 offset,Int32 count)处的缓冲区已满。如果您遇到缓冲区已满的异常,这意味着音频到达速度比播放速度快。您需要更大的缓冲区大小,或者在下载音频之前对其进行限制。”

您还应该在服务器端使用
e.BytesRecorded
,而不是
e.Buffer.Length
。这可能也是您看到的问题的原因


另一个错误是,您应该检查从
ns读取的字节数。读取
并在调用
bwp时使用该数字。AddSamples

我尝试使用记录的字节,但仍然看到此问题。我也尝试将缓冲区大小增加到~1GB,但仍然出现缓冲区已满异常。我不明白为什么播放器会it’播放数据的速度不够快。我想既然我在开始从网络流读取数据之前就开始播放,这就足够了。我应该在发送音频之前开始研究压缩音频吗?我想我已经看到了问题所在-你假设你总是从网络流读取满缓冲区的数据客户端的eam。将代码更改为此,一切正常。感谢您的帮助!int brx=ns.Read(buffer,0,buffer.Length);bwp.AddSamples(buffer,0,brx);
    public TcpClient client;
    public WaveOut waveplayer = new WaveOut();
    public BufferedWaveProvider bwp = new BufferedWaveProvider(new WaveFormat(8000, 16, 1));
    public byte[] buffer = new byte[1024 * 16];

    public Form1()
    {
        bwp.BufferLength = 1024 * 16;
        waveplayer.Init(bwp);
        waveplayer.Play();
    }

    public void audio()
    {
        try
        {
            client = new TcpClient(textBox1.Text.ToString(), 8001);
            NetworkStream ns = client.GetStream();
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }

        while (true)
        {
            try
            {
                ns.Read(buffer, 0, buffer.Length);
                bwp.AddSamples(buffer, 0, buffer.Length);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
    public NAudio.Wave.WaveInEvent sourcestream = null;
    public TcpListener listener = new TcpListener(IPAddress.Any, 8001);
    public TcpClient client;
    public NetworkStream ns;

    public Form1()
    {
        InitializeComponent();
        sourcestream = new NAudio.Wave.WaveInEvent();
        sourcestream.DeviceNumber = 0;            
        sourcestream.WaveFormat = new NAudio.Wave.WaveFormat(8000, 16, 1);
        sourcestream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(audioDataAvailable);
        sourcestream.StartRecording();
    }

    public void acceptclients()
    {
        listener = new TcpListener(IPAddress.Any, 8001);
        listener.Start();
        client = listener.AcceptTcpClient();
        ns = client.GetStream();
    }

    void audioDataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
    {
        try
        {
            if (client.Connected)
            {
                ns.Write(e.Buffer, 0, e.Buffer.Length);
                ns.Flush();
            }
        }
        catch(Exception ex)
        {