2013-07-31 6 views
8

मुझे नोडियो के साथ कुछ समस्याएं हैं और ध्वनि रिकॉर्डिंग सहेज रही हैं। कोड जो मैं वर्तमान में उस बिंदु पर काम करता हूं जहां यह WAV फ़ाइल सहेजता है, लेकिन जब मैं इसे खोलता हूं, तो विंडोज मीडिया प्लेयर एक त्रुटि देता है: "फ़ाइल को चलाने के दौरान विंडोज मीडिया प्लेयर को एक समस्या आई"माइक्रोफोन से ध्वनि रिकॉर्ड ध्वनि

मेरे पास दो बटन हैं , एक "रिकॉर्ड" बटन, जो दबाए जाने के बाद स्टॉप बटन में बदल जाता है। और मेरे पास "सेव" बटन है जो क्लिक करते समय, रिकॉर्डिंग को sample.wav पर सहेजता है।

NAudio.Wave.WaveIn sourceStream = null; 
NAudio.Wave.DirectSoundOut waveOut = null; 
NAudio.Wave.WaveFileWriter waveWriter = null; 

private void recordButton_Click(object sender, EventArgs e) 
{ 
    int deviceNumber = sourceList.SelectedItems[0].Index; 

    sourceStream = new NAudio.Wave.WaveIn(); 
    sourceStream.DeviceNumber = deviceNumber; 
    sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels); 

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

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

    sourceStream.StartRecording(); 
    waveOut.Play(); 

    recordButton.Visible = false; 
    stopRecord.Visible = true; 
} 

private void saveResponse_Click(object sender, EventArgs e) 
{ 
    int deviceNumber = sourceList.SelectedItems[0].Index; 

    string saveLocation = "c:\\wav\\sample.wav"; 

    sourceStream = new NAudio.Wave.WaveIn(); 
    sourceStream.DeviceNumber = deviceNumber; 
    sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels); 

    sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable); 
    waveWriter = new NAudio.Wave.WaveFileWriter(saveLocation, sourceStream.WaveFormat); 

    sourceStream.StartRecording(); 

    MessageBox.Show("Recording successfully saved."); 
} 

private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e) 
{ 
    if (waveWriter == null) return; 

    waveWriter.WriteData(e.Buffer, 0, e.BytesRecorded); 
    waveWriter.Flush(); 
} 
private void stopRecord_Click(object sender, EventArgs e) 
{ 
    if (waveOut != null) 
    { 
     waveOut.Stop(); 
     waveOut.Dispose(); 
     waveOut = null; 
    } 
    if (sourceStream != null) 
    { 
     sourceStream.StopRecording(); 
     sourceStream.Dispose(); 
     sourceStream = null; 
    } 
    if (waveWriter != null) 
    { 
     waveWriter.Dispose(); 
     waveWriter = null; 
    } 

    recordButton.Visible = true; 
    stopRecord.Visible = false; 
    saveResponse.Enabled = true; 
} 
+0

आप अपने 'स्टॉप' कार्रवाई के पीछे कोड दिखा सकते हैं तो कृपया:


यहाँ कोड मैं डिस्क पर एक लहर फाइल करने के लिए प्रत्यक्ष रिकॉर्डिंग के परीक्षण के लिए इस्तेमाल किया है? बस यह देखने की ज़रूरत है कि आप 'waveWriter' और इस तरह से बंद कैसे हो रहे हैं। – Corey

+0

@ कोरी, मैंने कोड में 'स्टॉप' एक्शन जोड़ा। चीयर्स। – Spencer

+0

ठीक है, इसी तरह के कोड के साथ परीक्षण किया गया है और सभी मेरे लिए काम कर रहे हैं। क्या आप डब्लूएमपी में इसे चलाने का प्रयास करने से पहले रिकॉर्डिंग रोक रहे हैं? – Corey

उत्तर

19

आपका recordButton_Click कोड रिकॉर्डिंग नहीं है, यह एक WaveOut, जो डेटा अपने स्रोत (माइक्रोफोन) सीधे निर्गम (स्पीकर) के लिए से आ रही खेलेंगे के लिए एक WaveIn से पाइपिंग डेटा है। यह बाद में उपयोग के लिए उस डेटा को बरकरार नहीं रखता है, यह सिर्फ इसे एक से दूसरे तक पाइप करता है। यदि आप बाद में उस डेटा को डिस्क पर सहेजना चाहते हैं, तो आपको इसे स्वयं बफर करना होगा।

saveResponse_Click दूसरी ओर माइक्रोफ़ोन से डेटा की डिस्क पर एक लहर फ़ाइल की प्रत्यक्ष रिकॉर्डिंग शुरू करने के लिए है। यदि आप अपने Save Response बटन पर क्लिक करते हैं, तो थोड़ी देर प्रतीक्षा करें, फिर अपने Stop बटन पर क्लिक करें, आपको एक रिकॉर्ड की गई लहर फ़ाइल प्राप्त करनी चाहिए।

यदि आप सीधे डिस्क पर रिकॉर्ड करना चाहते हैं, तो यह ठीक है। यदि आप स्मृति में रिकॉर्ड करना चाहते हैं, तो वैकल्पिक रूप से डिस्क पर लिखें, फिर आपको डेटा को सहेजने की आवश्यकता है। रिकॉर्डिंग करते समय डेटा को पकड़ने के लिए शायद मेमोरी स्ट्रीम का उपयोग करें, फिर इसे बचाने के लिए WaveFileWriter पर लिखें फ़ाइल।

public WaveIn waveSource = null; 
public WaveFileWriter waveFile = null; 

private void StartBtn_Click(object sender, EventArgs e) 
{ 
    StartBtn.Enabled = false; 
    StopBtn.Enabled = true; 

    waveSource = new WaveIn(); 
    waveSource.WaveFormat = new WaveFormat(44100, 1); 

    waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable); 
    waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped); 

    waveFile = new WaveFileWriter(@"C:\Temp\Test0001.wav", waveSource.WaveFormat); 

    waveSource.StartRecording(); 
} 

private void StopBtn_Click(object sender, EventArgs e) 
{ 
    StopBtn.Enabled = false; 

    waveSource.StopRecording(); 
} 

void waveSource_DataAvailable(object sender, WaveInEventArgs e) 
{ 
    if (waveFile != null) 
    { 
     waveFile.Write(e.Buffer, 0, e.BytesRecorded); 
     waveFile.Flush(); 
    } 
} 

void waveSource_RecordingStopped(object sender, StoppedEventArgs e) 
{ 
    if (waveSource != null) 
    { 
     waveSource.Dispose(); 
     waveSource = null; 
    } 

    if (waveFile != null) 
    { 
     waveFile.Dispose(); 
     waveFile = null; 
    } 

    StartBtn.Enabled = true; 
} 
+0

यह खूबसूरती से काम करता है। आपका बहुत बहुत धन्यवाद!! – Spencer

+0

जब मैं आपका कोड लिखता हूं, तो यह अपवाद फेंक रहा है और कह रहा है "BadDeviceId कॉलिंग waveInOpen"। कोई उपाय ? वह त्रुटि क्या है? – abidinberkay

+1

@abidinberkay डिफ़ॉल्ट डिवाइस नम्बर 0 है, यदि वह आईडी खराब है, तो शायद इसका मतलब है कि आपने कभी माइक्रोफ़ोन में प्लग नहीं किया है। –

संबंधित मुद्दे