【问题标题】:naudio: playing from pcm byte streamnaudio:从 pcm 字节流播放
【发布时间】:2017-05-14 16:56:47
【问题描述】:

我正在尝试将音频字节流式传输到 naudio waveout 流中,但它不起作用。这是伪代码:

byte[] by = new byte[2560]  //audio packet sizes
int counter=0;

while (true) {  //keep receiving bytes from incoming TCP socket
  int bytesAvailable = await stream.ReadAsync(by, 0, 2560);  //read incoming bytes
  if(counter==0) {
    using (var MemoryStream = new MemoryStream(by)) {
      var waveOut = new WaveOut();
      var waveFormat = new WaveFormat(16000, 16, 2); // wave format
      var rawSource = new RawSourceWaveStream(MemoryStream, waveFormat);
      waveOut.Init(rawSource);
      waveOut.Play();
      counter++;
  }    
}    

..但我什么也没听到。我猜它只是读取一个数据包并停止,但我不知道。

有人知道哪里出了问题/如何解决吗?我知道字节正在进来,因为我打印出最后一个字节,所以它与网络接收无关。

【问题讨论】:

  • 没关系,使用 BufferLength、DiscardOnBufferOverflow 和 AddSamples 让它工作。必须在缓冲区长度上玩一点,但我会说我有可能以不到一秒的延迟将其清除为 85%。我对此很满意。仍然希望看到其他人的实现,因为它可能会更好。
  • 你能用你的有效代码发布一个答案吗?我知道我来晚了,但这真的能帮到我!
  • 在下方发表新评论。但是,从那以后我没有看过代码,所以不确定它处于什么状态。不确定它对你的工作方式,让我知道。

标签: c# stream naudio pcm wave


【解决方案1】:

最好使用BufferedWaveProvider。只需创建一个从BufferedWaveProvider 播放的WaveOut 设备,然后将接收到的数据的字节数组添加到BufferedWaveProvider,因为它通过网络到达。

【讨论】:

  • 是的,这就是我正在使用的 (BufferedWaveProvider.AddSamples()...但我仍然发现我必须弄乱缓冲区的长度并将 DiscardOnBufferOverflow 设置为 true。
【解决方案2】:

对于 Ortund:

private async void StartClient()
    {
        String sName = "<server ip>";
        int port = <server port>;

        WaveOut waveout = new WaveOut(); 

        TcpClient conn = new TcpClient();

        try
        {

            int counter = 0;

            conn.Connect(sName, port);
            stream = conn.GetStream();               

            by = new byte[2560];  // new byte array to store received data

            var bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat(16000, 16, 2));
            bufferedWaveProvider.BufferLength = 2560 * 16;      //16 is pretty good
            bufferedWaveProvider.DiscardOnBufferOverflow = true;

            while (true)
            {
                //wait until buffer has data, then returns buffer length
                int bytesAvailable = await stream.ReadAsync(by, 0, 2560);

                if (counter == 0)
                {
                    msg = Encoding.UTF8.GetString(by, 0, bytesAvailable);
                    devicehash = msg.TrimEnd();
                    DispatchMethod(by[0].ToString());
                    counter++;                        
                }
                else
                {
                    //send to speakers

                    bufferedWaveProvider.AddSamples(by, 0, 2560);

                    if (counter == 1)
                    {
                        waveout.Init(bufferedWaveProvider);
                        waveout.Play();
                        counter++;
                    }                     
                }
            }
        }
        catch (Exception e)
        { 
        }
    }

【讨论】:

    猜你喜欢
    • 2014-02-13
    • 2021-12-20
    • 1970-01-01
    • 2017-05-23
    • 2013-01-05
    • 2013-06-05
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多