2013-07-21 200 views
0

好吧,我目前正在尝试使用NAudio和c#制作语音聊天软件。获取总延迟 - UDP音频通信

但我目前有一个问题,延迟似乎打赌越来越糟,越长的应用程序运行。

现在,我是一个初学者,所以我不知道可能是什么原因。

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

总延迟时间=输入缓冲区+网络延迟时间+输出缓冲区(如果有的话,我用的是UDP)。

所以,如果我有这样的:

Label.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); 


      } 

这里是接收部分,it's简单得多,它只是从UDP get's的数据,屁股缓冲和播放。

回答

0

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

+0

是啊,注意到,andi设置为4ms,那么我可以得到缓冲提供者(Buffer Duration),并将其添加到它。 – Zerowalker