naudio从麦克风录制声音然后保存

我在使用naudio和保存录音方面遇到了一些问题。 我目前使用的代码可以保存wav文件,但是当我打开它时,Windows Media Player会返回错误:“Windows Media Player在播放文件时遇到问题”

我有两个按钮,一个“录制”按钮,按下后会变成停止按钮。 我有一个“保存”按钮,单击该按钮,将记录保存到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(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; } 

您的recordButton_Click代码没有录制,它将WaveIn中的数据WaveInWaveOutWaveOut会将源(麦克风)的数据直接播放到输出(扬声器)。 它不保留该数据供以后使用,它只是将它从一个管道传输到另一个。 如果要随后将该数据保存到磁盘,则需要自行缓冲。

另一方面, saveResponse_Click 开始将数据从麦克风直接记录到磁盘上的波形文件中。 如果单击“ Save Response按钮,稍等一下,然后单击“ Stop按钮,就会得到一个记录的波形文件。

如果你想直接录制到磁盘,这很好。 如果你想记录到内存,然后选择写入磁盘,那么你需要保存数据。也许在记录时使用内存流来保存数据,然后在WaveFileWriter时将其写入WaveFileWriter文件。


这是我用于测试直接录制到磁盘上的wave文件的代码:

 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(waveSource_DataAvailable); waveSource.RecordingStopped += new EventHandler(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; }