0

好的,我目前正在尝试使用 NAudio 和 c# 制作语音聊天软件。

但是我目前有一个问题,应用程序运行的时间越长,延迟似乎越差。

现在,我是一个完全的初学者,所以我不知道是什么原因造成的。

但是为了排除故障,我想知道我是否可以获得总延迟,看看它随着时间的推移增加了多少。

总延迟 = 输入缓冲区 + 网络延迟 + 输出缓冲区(如果有更多,我正在使用 UDP)。

所以如果我有类似的东西:

标签.text = TotalLatency();

它会一直更新。

            while (!bStop)
            {
                byte[] datanbefore = waveStream.GetBuffer();

                autoResetEvent.WaitOne();
                waveStream.Position = 0;
                captureBuffer.Read(offset, waveStream, halfBuffer, LockFlag.None);
                readFirstBufferPart = !readFirstBufferPart;
                offset = readFirstBufferPart ? 0 : halfBuffer;

                //TODO: Fix this ugly way of initializing differently.

                //Mute Mic when button is checked
                if (MuteMic.Checked)
                {
                    waveStream = new MemoryStream(halfBuffer);
                }

                byte[] datanaudio = waveStream.GetBuffer();
                udpClient.Send(datanaudio, datanaudio.Length, otherPartyIP.Address.ToString(), 5550);


            }

所以这里是发送部分。我不太确定缓冲是如何工作的,因为我使用免费示例启动了应用程序,并且一直在到处更改它,但仍然存在一些部分,但我认为缓冲可以改进。

  while (!bStop)
            {

                //Receive data.
                byte[] byteData = udpClient.Receive(ref remoteEP);
                waveProvider.AddSamples(byteData, 0, byteData.Length);


            }

这是接收部分,它更简单,它只是从 UDP 获取数据,将其放入缓冲区并播放。

4

1 回答 1

0

您可以通过了解 WaveIn 和 WaveOut 的缓冲区大小来粗略计算输入和输出延迟。默认情况下,在 NAudio 中,它们都是 100 毫秒。对于网络延迟,您可以尝试为音频数据包添加时间戳,尽管两台机器的时钟需要同步。

于 2013-07-22T09:55:18.143 回答