2013-01-14 2 views
7

저는 NAudio를 처음 사용하고 있으며 마이크에서 오디오를 녹음하고 Wave 파일에 기록하는 작은 프로그램을 작성하려고합니다. 내 프로그램의 Main 함수에서 recordStuff() 함수를 호출하면 프로그램이 WaveIn 객체의 생성을 지나치지 않고 프로그램이 "WaveInEvent를 사용하여 백그라운드 스레드에 기록"이라는 메시지가있는 InvalidOperationException과 함께 종료됩니다. . NAudio에 대한 지식이있는 사람이이게 무슨 뜻인지 말해 줄 수 있습니까? recordStuff() 함수를 자체 스레드로 호출 해봤지만 동일한 결과가 발생합니다.NAudio WaveIn을 구성 할 때 InvalidOperationException이 발생했습니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using NAudio.Wave; 

namespace SimpleWave 
{ 
    class Recorder 
    { 
     public Recorder() 
     { 
      writer = new WaveFileWriter("C:\\Users\\Paul\\Desktop\\yeah.wav", new NAudio.Wave.WaveFormat(44100, 1)); 
     } 

     public static List<byte> buff = new List<byte>(); 
     public static WaveFileWriter writer; 

     public void recordStuff() 
     { 
      // WaveIn Streams for recording 
      WaveIn waveInStream; 

      waveInStream = new WaveIn(); 
      waveInStream.DeviceNumber = 0; 
      waveInStream.WaveFormat = new WaveFormat(44100, 2); 
      writer = new WaveFileWriter(@"C:\Users\Paul\Desktop\this.wav", waveInStream.WaveFormat); 

      waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable); 
      waveInStream.StartRecording(); 
     } 

     public void waveInStream_DataAvailable(object sender, WaveInEventArgs e) 
     { 
      writer.Write(e.Buffer, 0, e.BytesRecorded); 
     } 
    } 
} 

답변

12

기본값 인 WaveIn 생성자는 콜백에 Windows 메시지를 사용합니다. 그러나 콘솔 앱이나 백그라운드 스레드에서 실행 중이면 해당 Windows 메시지가 처리되지 않습니다. 가장 쉬운 해결책은 대신 WaveInEvent 클래스를 사용하는 것입니다.

waveInStream = new WaveInEvent(); 

코드의 또 다른 문제는이 기록을 완료 할 때까지 당신이 waveInStream 살아 유지할 필요가있다 (즉, 당신은 어떤 점에서 StopRecording를 호출 할 수 있도록해야합니다) 당신이 waveInStream 필드를해야하므로, Recorder 클래스의

+0

Windows 메시지 란 무엇입니까? –

관련 문제