WaveIn

2013-01-14 33 views
7

का निर्माण करते समय NAudio InvalidOperationException मैं NAudio के लिए बहुत नया हूं और एक छोटा प्रोग्राम लिखने की कोशिश कर रहा हूं जो माइक्रोफ़ोन से कुछ ऑडियो रिकॉर्ड करता है और इसे वेव फ़ाइल में लिखता है। जब मैं अपने प्रोग्राम के मुख्य समारोह में recordStuff() फ़ंक्शन को कॉल करता हूं, तो प्रोग्राम WaveIn ऑब्जेक्ट पर निर्माण को पीछे नहीं लाता है और प्रोग्राम एक अवैधऑपरेशन अपवाद के साथ मर जाता है जिसमें संदेश "पृष्ठभूमि थ्रेड पर रिकॉर्ड करने के लिए WaveInEvent का उपयोग करें" । क्या कोई व्यक्ति नूडियो के ज्ञान के साथ मुझे बता सकता है कि इसका क्या अर्थ है? मैंने recordStuff() फ़ंक्शन को अपने स्वयं के धागे में कॉल करने का प्रयास किया है, लेकिन मैं एक ही परिणाम के साथ समाप्त होता हूं।WaveIn

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 कन्स्ट्रक्टर कॉलबैक के लिए विंडोज संदेशों का उपयोग करता है। हालांकि, अगर आप कंसोल ऐप चला रहे हैं, या पृष्ठभूमि थ्रेड से हैं, तो उन विंडोज संदेशों को संसाधित नहीं किया जाएगा। सबसे आसान समाधान WaveInEvent कक्षा का उपयोग करना है।

waveInStream = new WaveInEvent(); 

अपने कोड के साथ एक और समस्या यह है कि आप waveInStream जीवित रखने के लिए जब तक आप रिकॉर्डिंग का काम पूरा कर लिया है की जरूरत है (यानी आप कुछ बिंदु पर StopRecording कॉल करने के लिए सक्षम होने के लिए की आवश्यकता होगी) ताकि आप waveInStream एक क्षेत्र बनाना चाहिए, Recorder कक्षा का।

+0

विंडोज संदेश क्या हैं? –