2011-04-17 10 views

Trả lời

4

Cách tốt nhất là sử dụng BufferedWaveProvider làm đầu vào cho WaveOut. Sau đó, trong callback DataAvailable của WaveIn, cung cấp các dữ liệu được ghi vào BufferedWaveProvider

void DataAvailable(object sender, WaveInEventArgs args) 
{ 
    bufferedWaveProvider.AddSamples(args.Buffer, 0, args.BytesRecorded); 
} 

Bạn cần phải nhận thức rằng kích thước bộ đệm mặc định sẽ dẫn đến một sự chậm trễ đáng kể, vì vậy nếu bạn đang hy vọng cho độ trễ thấp bạn có thể cần để thử nghiệm một chút với kích thước bộ đệm để xem mức độ thấp của bạn.

12

Đây là mã hoạt động cho tôi:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using NAudio.Wave; 
using NAudio.CoreAudioApi; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form4 : Form 
    { 

     private BufferedWaveProvider bwp; 

     WaveIn wi; 
     WaveOut wo; 
     public Form4() 
     { 
      InitializeComponent(); 
      wo = new WaveOut(); 
      wi = new WaveIn(); 

      wi.DataAvailable += new EventHandler<WaveInEventArgs>(wi_DataAvailable); 

      bwp = new BufferedWaveProvider(wi.WaveFormat); 
      bwp.DiscardOnBufferOverflow = true; 

      wo.Init(bwp); 
      wi.StartRecording(); 
      wo.Play(); 

     } 

     void wi_DataAvailable(object sender, WaveInEventArgs e) 
     { 
      bwp.AddSamples(e.Buffer, 0, e.BytesRecorded); 

     } 
    } 
}