在Naudio中更快地处理线程音频

问题描述

我使用 Naudio 来同时录制和播放来自麦克风的输入。

当我处理输入信号,在ISTFT之后实现STFT并播放它,在'Buffer full'中收到bufferedWaveProvider.AddSamples(e.Buffer,e.BytesRecorded)时发生问题。

代码

public partial class Form1 : Form
{
   private WaveIn recorder;
   private BufferedWaveProvider bufferedWaveProvider;
   private SavingWaveProvider savingWaveProvider;
   private WaveOutEvent player;
   public Form1()
   {
      InitializeComponent();
   }

   private void Form1_Load(object sender,EventArgs e)
   {
      numericupdown1.Value = 1;
      numericupdown1.DecimalPlaces = 1;
      numericupdown1.Increment = 0.1M;
      numericupdown1.Maximum = 1;
      numericupdown1.Minimum = 0;
   }

   private void button1_Click(object sender,EventArgs e)
   {
      recorder = new WaveIn();
      recorder.BufferMilliseconds = 50;
      recorder.WaveFormat = new WaveFormat(44100,32,1);
      recorder.DataAvailable += RecorderOnDataAvailable;
      bufferedWaveProvider = new BufferedWaveProvider(recorder.WaveFormat);

      savingWaveProvider = new SavingWaveProvider(bufferedWaveProvider,"temp.wav");

      // set up playback
      player = new WaveOutEvent();
      var watch = new System.Diagnostics.Stopwatch();  //=============================do thoi gian=================
      watch.Start();
      stftxx nghexx = new stftxx();
      IWaveProvider nghe = nghexx.trienkhaistft(bufferedWaveProvider);
      watch.Stop();
      long time2 = watch.ElapsedMilliseconds;//==============do thoi gian============
      textBox1.Text = time2.ToString();
      player.Init(nghe);
      //Console.Write(player);
      // begin playback & record
      player.Volume = 1;
      player.Play();
      recorder.StartRecording();
   }
   private void RecorderOnDataAvailable(object sender,WaveInEventArgs e)
   {
      bufferedWaveProvider.AddSamples(e.Buffer,e.BytesRecorded);
   }
   private float AverageAllValuesInlistofTuplesOfArraysOfFloats(List<(float[],float[])> list)
   {
      // Create a new list which will contain the "flattened" list of tuples.
      var allValuesInAllLists = new List<float>();

      // Iterate over all the tuples of arrays
      foreach (var tupleOfArrays in list)
      {
         // in each tuple of arrays,add the items from both
         // arrays the the flattened list which contains all
         // the values.
         allValuesInAllLists.AddRange(tupleOfArrays.Item1);
         allValuesInAllLists.AddRange(tupleOfArrays.Item2);
      }

      // Now we've got one big list of values. Average it.
      return allValuesInAllLists.Average();
   }
   private void button3_Click(object sender,EventArgs e)
   {
      recorder.StopRecording();
      player.Stop();
      savingWaveProvider.dispose();
   }

   private void numericupdown1_ValueChanged(object sender,EventArgs e)
   {
      player.Volume = (float)numericupdown1.Value;
   }

   private void textBox1_TextChanged(object sender,EventArgs e)
   {

   }
}

我认为与其像这样处理:

one process

我可以这样处理吗?:

two process

我不知道这种处理方式叫什么。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)