2015-04-27 2 views
3

Следующий код дает мне ошибку «Buffer full», и я понятия не имею, почему. Мой код должен был дать мне волновой график, пока он записывает звук. Тем не менее, волновая диаграмма работает и через 5 секунд выше ошибки выводится на экран моя программаПочему запись звука дает ошибку Буфер заполнен через 5 секунд?

Пожалуйста, помогите мне. Я новичок в этом.

private void btnRecord_Click(object sender, EventArgs e) 
     { 
      if (btnRecord.Text == "Record") 
      { 
       sources = new List<NAudio.Wave.WaveInCapabilities>(); 

       for (int i = 0; i < NAudio.Wave.WaveIn.DeviceCount; i++) 
       { 
        sources.Add(NAudio.Wave.WaveIn.GetCapabilities(i)); 
       } 

       input = new NAudio.Wave.WaveIn(); 
       input.DeviceNumber = 0; 
       input.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(0).Channels); 

       NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(input); 

       waveOut = new NAudio.Wave.DirectSoundOut(); 
       waveOut.Init(waveIn); 

       input.StartRecording(); 

       //waveOut.Play(); 
       input.DataAvailable += input_DataAvailable; 
       btnRecord.Text = "Stop Record"; 
      } 
      else if (btnRecord.Text == "Stop Record") 
      { 
       waveOut.Stop(); 
       input.StopRecording(); 
       btnRecord.Text = "Record"; 
       input.Dispose(); 

      } 
     } 

private void input_DataAvailable(object sender, WaveInEventArgs e) 
     { 
      MemoryStream memStream = new MemoryStream(); 
      memStream.Write(e.Buffer, 0, e.BytesRecorded);    


      RawSourceWaveStream rawSource = new RawSourceWaveStream(memStream, input.WaveFormat); 
      customWaveViewer2.WaveStream = rawSource; 
      rawSource.Flush(); 
      memStream.Flush(); 
     } 

Следующая будет StackTrace

at NAudio.Wave.BufferedWaveProvider.AddSamples(Byte[] buffer, Int32 offset, Int32 count) 
    at NAudio.Wave.WaveInProvider.waveIn_DataAvailable(Object sender, WaveInEventArgs e) 
    at System.EventHandler`1.Invoke(Object sender, TEventArgs e) 
    at NAudio.Wave.WaveIn.RaiseDataAvailable(WaveInBuffer buffer) 
    at NAudio.Wave.WaveIn.Callback(IntPtr waveInHandle, WaveMessage message, IntPtr userData, WaveHeader waveHeader, IntPtr reserved) 
    at NAudio.Wave.WaveWindow.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at Pitch_Comparer.Program.Main() in c:\Users\Nadeesha\Documents\Visual Studio 2012\Projects\Pitch_Comparer\Pitch_Comparer\Program.cs:line 19 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
+0

Это ваш полный код? Я подозреваю, что вы делаете обработку с входящими образцами. – DrKoch

+0

Нравится? – gayan1991

+1

Я думаю, вы используете слишком много CPU во время записи, поэтому некоторые буферы показывают переполнения – DrKoch

ответ

2

WaveInProvider записывает аудио и положить его в BufferedWaveProvider. Таким образом, ваш WaveOut должен играть или буфер заполнится. (так что uncomment waveOut.Play, чтобы исправить проблему).

Если вы действительно не хотите воспроизводить аудиозапись, которую вы записываете, просто используйте обычный WaveIn, а не WaveInProvider.

Смежные вопросы