Vb.net NAudio计算机音频网络流式失真
我在线研究了如何使用NAudio在VB.net/C中将音频从一台计算机发送到另一台计算机。根据我在互联网上找到的所有信息,我制作了两个测试程序:一个发送音频(Wasapi环回),另一个接收并播放音频。它们看起来像这样 发件人:Vb.net NAudio计算机音频网络流式失真,vb.net,audio,udp,naudio,Vb.net,Audio,Udp,Naudio,我在线研究了如何使用NAudio在VB.net/C中将音频从一台计算机发送到另一台计算机。根据我在互联网上找到的所有信息,我制作了两个测试程序:一个发送音频(Wasapi环回),另一个接收并播放音频。它们看起来像这样 发件人: Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Using Capture As New WasapiLoopbackCapture()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Using Capture As New WasapiLoopbackCapture()
MsgBox("Format information" + vbNewLine + vbNewLine + " Sample Rate: " + Capture.WaveFormat.SampleRate.ToString() + vbNewLine + " Bits per Sample: " + Capture.WaveFormat.BitsPerSample.ToString() + vbNewLine + " Channels: " + Capture.WaveFormat.Channels.ToString(), 64, "")
Dim client As New UdpClient
Dim ep As New IPEndPoint(IPAddress.Parse("192.168.1.101"), 12345)
client.Connect(ep)
Capture.StartRecording()
Using w As New WaveFileWriter("dump.wav", Capture.WaveFormat)
AddHandler Capture.DataAvailable, Sub(s As Object, f As WaveInEventArgs)
client.Send(f.Buffer, f.BytesRecorded)
w.Write(f.Buffer, 0, f.BytesRecorded)
End Sub
Threading.Thread.Sleep(10000)
Capture.StopRecording()
End Using
End Using
End Sub
接收端:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim client As New UdpClient(12345)
Dim endPoint As New IPEndPoint(IPAddress.Any, 12345)
Dim ms As MemoryStream
While True
Dim data() As Byte
data = client.Receive(endPoint)
ms = New MemoryStream(data)
ms.Position = 0
Dim rs As New RawSourceWaveStream(ms, New WaveFormat(44100, 32, 2))
Dim wo As New WaveOut()
wo.Init(rs)
wo.Play()
End While
End Sub
这确实有效,它创建dump.wav文件(不失真),并将音频发送到接收端,然后播放音频,但是音频非常响亮且失真严重
我不确定是什么导致了这个问题,但它可能是由UDPClient引起的。但我不认为是发送方造成了问题,因为dump.wav生成时没有失真或声音过大
我无法在网上找到任何解决方案,也不知道问题的真正根源。UDP协议本身无法知道数据包是否在传输过程中丢失,因此它不能保证您发送的数据包到达 如果数据包丢失,那么您的文件(当然)就会损坏。解决方案是切换到TCP(只要连接处于活动状态,就可以保证数据的到达和顺序),或者找到一个可靠的UDP实现 TCP的两个瓶颈是:
- 它是一个流式协议,这意味着在应用层上没有数据包的概念。它只是提供一个(恒定的)字节流
- 它比UDP慢一些(但不一定太慢!)。它的速度是否足够,你得自己决定
- 消息框架描述:
- VB.NET实现:
波形不匹配导致了失真。它不是32位PCM,而是浮点,所以使用WaveFormat.CreateIeeeFloatWaveFormat
但是,您可能需要重新考虑通过网络发送此音量的音频数据。通常,对于聊天应用程序,您希望通过压缩音频来减少带宽,或者选择单声道和较低的采样率
NAudioDemo项目有一个网络聊天示例,展示了如何做到这一点