Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net NAudio计算机音频网络流式失真_Vb.net_Audio_Udp_Naudio - Fatal编程技术网

Vb.net NAudio计算机音频网络流式失真

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

我在线研究了如何使用NAudio在VB.net/C中将音频从一台计算机发送到另一台计算机。根据我在互联网上找到的所有信息,我制作了两个测试程序:一个发送音频(Wasapi环回),另一个接收并播放音频。它们看起来像这样

发件人:

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项目有一个网络聊天示例,展示了如何做到这一点