【问题标题】:Choppy Audio with Naudio and TCP Stream. Buffer Full Exception带有 Naudio 和 TCP 流的断断续续的音频。缓冲区满异常
【发布时间】:2019-08-19 20:54:46
【问题描述】:

我正在尝试使用 Naudio 通过 TCP 连接流式传输音频。问题是音频听起来不连贯。我相信这是因为当我尝试将样本添加到 bufferedwaveprovider 时,我收到一个异常提示缓冲区已满。

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

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

    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)
        {            

这是我收到的确切错误

"System.InvalidOperationException: NAudio.Wave.BufferedWaveProvider.AddSamples(Byte[] buffer, Int32 offset, Int32 count) 的缓冲区已满

【问题讨论】:

    标签: c# tcp naudio


    【解决方案1】:

    如果您遇到缓冲区已满异常,这意味着音频到达的速度比您播放它的速度要快。您要么需要更大的缓冲区大小,要么在下载之前限制音频。

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

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

    【讨论】:

    • 我尝试使用记录的字节,但我仍然看到这个问题。
    • 我也尝试将缓冲区大小增加到 ~1GB,但我仍然遇到缓冲区满异常。我不明白为什么播放器播放数据的速度不够快。我会认为,因为我在开始从网络流中读取之前就开始玩了,所以这就足够了。我应该在发送之前开始研究压缩音频吗?
    • 我想我已经看到问题出在哪里了——你假设你总是从客户端的网络流中读取一个充满数据的完整缓冲区。
    • 将代码更改为此,一切正常。谢谢您的帮助! int brx = ns.Read(buffer, 0, buffer.Length); bwp.AddSamples(buffer, 0, brx);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多