2013-02-27 7 views
-1

나는 NAudio를 사용하여 마이크에 대해 말하는 것을 듣고 싶습니다. 그리고 이것은 지금까지 제 코드이지만 문제는 들리지 않습니다. 어떤 도움을 주시면 감사하겠습니다.마이크에서 들어오는 오디오 듣기

public partial class frmMain : Form 
    { 
     private WaveIn waveIn; // Gets an audio from microphone 
     private WaveOut waveOut; // Sends audio to speaker 
     private BufferedWaveProvider waveProvider; // Gets an audio from stream 

     public frmMain() 
     { 
      InitializeComponent(); 
     } 

     private void frmMain_Load(object sender, EventArgs e) 
     { 
      waveOut = new WaveOut(); 
      waveIn = new WaveIn(); 
      waveProvider = new BufferedWaveProvider(waveIn.WaveFormat); 

      waveOut.Init(waveProvider);    

      waveIn.DataAvailable += waveIn_DataAvailable; 

      waveOut.Play();    
     } 

     private void waveIn_DataAvailable(object sender, WaveInEventArgs e) 
     { 
      waveProvider.Read(e.Buffer, 0, e.BytesRecorded); 
     } 

     private void btnStop_Click(object sender, EventArgs e) 
     { 
      waveIn.StopRecording(); 
      waveIn.Dispose(); 
     } 

     private void btnStart_Click(object sender, EventArgs e) 
     { 
      waveIn.StartRecording(); 
     } 
    } 

난 후 스피커로 보내 내가 BufferedWaveProvider 데이터를 읽 클라이언트 측에서 그 소켓에 마이크로부터 데이터를 전송하는 네트워크 프로그래밍에서이 시나리오를 사용한다. 더 좋은 방법이 있다면 몇 가지 의견을 적어주십시오.

TIA

+1

DataAvailable 이벤트에서 잘못된 스트림에서 읽고 있습니다. 그러면 아무 것도하지 않아요. –

+1

당신의'waveIn_DataAvailable' 메쏘드는'waveProvider'에서 쓰는 대신에 그것을 읽으려고합니다. 'waveProvider.Read'를'waveProvider.AddSamples'로 변경하고 도움이되는지 확인하십시오. 또한'waveIn' 객체의 초기화가 완료되지 않은 것 같습니다 ... 당신은'waveIn.StartRecording'을 호출하지 않았습니다. – Corey

+0

btnStart_Click 이벤트에서 StartRecording을 수행합니다. –

답변

5

약속 된대로 샘플 코드. 코드는 두 개의 단추 (StartBtn 및 StopBtn)가있는 양식 용입니다.

public partial class Form1 : Form 
{ 
    private WaveIn waveIn = null; 
    private BufferedWaveProvider waveProvider = null; 
    private WaveOut waveOut = null; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void StartBtn_Click(object sender, EventArgs e) 
    { 
     if (waveIn != null) 
      return; 

     // create wave input from mic 
     waveIn = new WaveIn(this.Handle); 
     waveIn.BufferMilliseconds = 25; 
     waveIn.RecordingStopped += waveIn_RecordingStopped; 
     waveIn.DataAvailable += waveIn_DataAvailable; 

     // create wave provider 
     waveProvider = new BufferedWaveProvider(waveIn.WaveFormat); 

     // create wave output to speakers 
     waveOut = new WaveOut(); 
     waveOut.DesiredLatency = 100; 
     waveOut.Init(waveProvider); 
     waveOut.PlaybackStopped += wavePlayer_PlaybackStopped; 

     // start recording and playback 
     waveIn.StartRecording(); 
     waveOut.Play(); 
    } 

    void waveIn_DataAvailable(object sender, WaveInEventArgs e) 
    { 
     // add received data to waveProvider buffer 
     if (waveProvider != null) 
      waveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded); 
    } 

    private void StopBtn_Click(object sender, EventArgs e) 
    { 
     if (waveIn != null) 
      waveIn.StopRecording(); 
    } 

    void waveIn_RecordingStopped(object sender, StoppedEventArgs e) 
    { 
     // stop playback 
     if (waveOut != null) 
      waveOut.Stop(); 

     // dispose of wave input 
     if (waveIn != null) 
     { 
      waveIn.Dispose(); 
      waveIn = null; 
     } 

     // drop wave provider 
     waveProvider = null; 
    } 

    void wavePlayer_PlaybackStopped(object sender, StoppedEventArgs e) 
    { 
     // stop recording 
     if (waveIn != null) 
      waveIn.StopRecording(); 

     // dispose of wave output 
     if (waveOut != null) 
     { 
      waveOut.Dispose(); 
      waveOut = null; 
     } 
    } 
} 

참고 특히 waveIn.BufferMillisecondswaveOut.DesiredLatency 설정은 지연 시간을 줄일 수 있습니다.

네트워크 전송을 위해 데이터를 압축하는 경우 다른 라이브러리를 사용하여 데이터 블록을 처리하는 것이 좋습니다. 오버 헤드를 줄이고 더 나은 압축 비율을 얻으려면 BufferMilliseconds 값을 조정해야 할 수도 있습니다.

Opus Codec은 합리적인 옵션처럼 보이며 C#의 경우 Opus.NET입니다.

관련 문제