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

本文关键字:然后 保存 声音 麦克风 naudio | 更新日期: 2023-09-27 18:25:48

我在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<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;
}

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

您的recordButton_Click代码不是在录制,而是将数据从WaveIn管道传输到WaveOut,后者将直接将来自源(麦克风)的数据播放到输出(扬声器)。它不保留这些数据供以后使用,只是通过管道将数据从一个数据传输到另一个数据。如果您想随后将数据保存到磁盘,您需要自己对其进行缓冲。

另一方面,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;
}