2013-07-31 3 views
8

Ich habe einige Probleme mit naudio und Speichern von Tonaufnahmen. Der Code, den ich derzeit habe, funktioniert an dem Punkt, wo es die WAV-Datei speichert, aber wenn ich es öffne, gibt Windows Media Player einen Fehler zurück: "Windows Media Player hat ein Problem beim Abspielen der Datei"naudio Schall von Mikrofon aufzeichnen dann speichern

Ich habe zwei Tasten , eine "Record" -Taste, die nach dem Drücken zur Stopptaste wird. Und ich habe eine Schaltfläche "Speichern", die bei einem Klick speichert die Aufzeichnung in 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

Können Sie den Code hinter dem ‚Stop‘ Aktion zeigen, bitte? Ich muss nur sehen, wie du den "waveWriter" und so weiter verschließt. – Corey

+0

@Corey, ich habe die Aktion 'stop' zum Code hinzugefügt. Prost. – Spencer

+0

OK, getestet mit ähnlichem Code und alles scheint für mich zu funktionieren. Stoppen Sie die Aufnahme, bevor Sie versuchen, sie in WMP abzuspielen? – Corey

Antwort

19

Ihr recordButton_Click Code nicht aufzeichnet, ist es Rohrleitungen Daten von einem WaveIn zu einem WaveOut, die die Daten spielen werden von der Quelle kommenden (Mikrofon) direkt mit dem Ausgang (Lautsprecher). Es speichert diese Daten nicht für spätere Verwendung, sondern leitet sie einfach von einem zum anderen. Wenn Sie diese Daten anschließend auf der Festplatte speichern möchten, müssen Sie sie selbst puffern.

Die saveResponse_Click auf der anderen Seite ist beginnend die direkte Aufnahme von Daten aus dem Mikrofon in eine Wave-Datei auf der Festplatte. Wenn Sie auf die Schaltfläche Save Response klicken, warten Sie ein wenig und klicken Sie dann auf Ihre Stop Schaltfläche. Sie sollten eine aufgezeichnete Wave-Datei erhalten.

Wenn Sie direkt auf Festplatte aufnehmen möchten, ist das in Ordnung. Wenn Sie in den Arbeitsspeicher aufnehmen und dann optional auf den Datenträger schreiben möchten, müssen Sie die Daten so speichern, wie sie geliefert werden. Verwenden Sie möglicherweise einen Speicherstream, um die Daten während der Aufzeichnung zu speichern, und schreiben Sie diesen dann in die Datei WaveFileWriter die Datei.


Hier ist der Code, den ich zum Testen direkte Aufnahme auf eine Wave-Datei auf der Festplatte verwendet:

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

Das funktioniert wunderbar. Vielen Dank!! – Spencer

+0

Wenn ich Ihren Code schreibe, wirft er eine Exception und sagt "BadDeviceId calling waveInOpen". irgendein Vorschlag ? Was ist das für ein Fehler? – abidinberkay

+1

@abidinberkay Die Standardeinstellung DeviceNumber ist 0, wenn diese ID schlecht ist, bedeutet dies wahrscheinlich, dass Sie noch nie ein Mikrofon angeschlossen haben. –

Verwandte Themen