从字节数组播放实时音频

4

我正在使用dma(LAN-TCP)从麦克风向PC发送音频:

while (1) {
      U32 max;
    int r,i;
    main_TcpNet ();     
        if(tcpSend & sendBuffer)
        {
      if(selectBuffer)
            {
                 send_datalog(ADC_RegularConvertedValueTab2,sizeof(ADC_RegularConvertedValueTab2));
               sendBuffer = 0;
            }
            else
            {   
                 send_datalog(ADC_RegularConvertedValueTab,sizeof(ADC_RegularConvertedValueTab));
               sendBuffer = 0;
            }


        main_TcpNet (); 

        }
  }
}

我需要实时播放音频,目前我使用NAudio已经完成了以下步骤:

         byte[] recBuff = new byte[1400];
public void OnDataReceived(IAsyncResult asyn)
            {
                try
                {
                    SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
                    int iRx = theSockId.thisSocket.EndReceive(asyn);

                    recBuff [count]= theSockId.dataBuffer[0];
                    count++;
                    if (count >= 1400)
                    {

                       //--------------------------------------------------------------------
                        for (int i = 0; i < 1400; i += 2)
                            recieveSound[i / 2] = recBuff[i] + (recBuff[i + 1] * 256);  //turn back to 16bit
                        //--------------------------------------------------------------------
                        foreach(int data in recieveSound)
                            sound.Add(data);
                        //----------------------------------
                        if (playStauts)
                        {

                                if (firstplay)
                               {




                          IWaveProvider provider = new RawSourceWaveStream(
                                                            new MemoryStream(recBuff), new WaveFormat());

                          _waveOut.Init(provider);
                          _waveOut.Play();









                                   //playThread.Start();
                                    //firstplay = false;
                               }
                           }
                        else
                        {
                            player.Stop();
                        }

                        count = 0; //RESET THE RecBuff
                    }
                     //---------------------------------------------------------------


                }
                catch (ObjectDisposedException)
                {
                    System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
                }
                catch (SocketException se)
                {
                    MessageBox.Show(se.Message);
                }

            }

            private void exitToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (m_clientSocket != null)
                {
                    m_clientSocket.Close();
                    m_clientSocket = null;
                }
                Close();
            }



            private void frmMain_Load(object sender, EventArgs e)
            {
                playThread = new Thread(new ThreadStart(play));
                player = new SoundPlayer(filePath);
                toolStriplbIP.Text = "Your IP: " + GetIP();
                btnDisconnect.Enabled = false;
            }




            #region Palying Sound
            private void btnPlay_Click(object sender, EventArgs e)
            {
                try
                {
                    //Array.Clear(sound, 0, sound.Count);
                    buffCount = 0;
                    offsetSound = 0;
                    sound.Clear();
                    Object objData = "7";
                    byte[] byData = System.Text.Encoding.ASCII.GetBytes(objData.ToString());
                    if (m_clientSocket != null)
                        m_clientSocket.Send(byData);
                    playStauts = true;

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);

                }
            }
            private void btnPause_Click(object sender, EventArgs e)
            {
                playStauts = false;
            }
            #endregion

            public void play()
            {

                while(true){

                    using (SoundPlayer player = new SoundPlayer(filePath))
                    {
                       //????????

                    }

                }
            }

我刚刚听到了好像是每秒钟有亿万个嗡嗡声。但是当我保存它并播放时,我可以清晰地听到歌曲声音很大。

出了什么问题?我的字节数组在增长时如何播放?

这对我有效吗?

byte[] bytes = new byte[1400];

IWaveProvider provider = new RawSourceWaveStream(
                         new MemoryStream(bytes), new WaveFormat());

_waveOut.Init(provider);
_waveOut.Play();

"ADC_RegularConvertedValueTab" 是一个字节还是一个字节数组? - Gabriel
@Gabriel,正如您在此处所看到的recBuff [count] = theSockId.dataBuffer [0];,它是字节。 - Choclate
1个回答

2

首先,你正在使用默认的WaveFormat,这可能是正确的,也可能不正确。源格式和目标格式之间的不一致肯定会导致问题。

确定WaveFormat正确后,我建议将BufferedWaveProvider用作波形播放器的输入,而不是使用MemoryStream,像这样:

WaveFormat Format = new WaveFormat(/* fill in the right parameters here */);
BufferedWaveProvider Provider = new BufferedWaveProvider(Foramt);

然后,当您对recBuff感到满意时,只需调用Provider.AddSamples将数据放入BufferedWaveProvider中,然后您的WaveOut播放器将会使用它。

还有一些其他奇怪的事情正在发生。您只接收一个字节吗?看起来您的异步处理程序正在这样做。这可能不是最好的选择,因为这将导致大量的上下文切换。如果您一次接收多个字节,则只获取第一个字节并忽略其余部分。这无疑会在播放过程中产生“意外”的声音。


我已经用C++完成了这个。只需要缓冲区,谢谢。 - Choclate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接