Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# naudio从麦克风录制声音,然后保存_C#_Naudio - Fatal编程技术网

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

C# naudio从麦克风录制声音,然后保存,c#,naudio,C#,Naudio,我对naudio和保存录音有一些问题。我目前拥有的代码可以保存wav文件,但当我打开它时,Windows Media Player返回一个错误:“Windows Media Player在播放该文件时遇到问题” 我有两个按钮,一个“记录”按钮,按下后会变成停止按钮。我有一个“Save”(保存)按钮,单击该按钮时,会将录制保存到sample.wav NAudio.Wave.WaveIn sourceStream = null; NAudio.Wave.DirectSoundOut waveOut

我对naudio和保存录音有一些问题。我目前拥有的代码可以保存wav文件,但当我打开它时,Windows Media Player返回一个错误:“Windows Media Player在播放该文件时遇到问题”

我有两个按钮,一个“记录”按钮,按下后会变成停止按钮。我有一个“Save”(保存)按钮,单击该按钮时,会将录制保存到
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.Wave.WaveIn sourceStream=null;
NAudio.Wave.DirectSoundOut waveOut=null;
NAudio.Wave.waveilewriter waveWriter=null;
私有无效记录按钮\u单击(对象发送者,事件参数e)
{
int deviceNumber=sourceList.SelectedItems[0]。索引;
sourceStream=new NAudio.Wave.WaveIn();
sourceStream.DeviceNumber=设备编号;
sourceStream.WaveFormat=新的NAudio.Wave.WaveFormat(44100,NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);
NAudio.Wave.WaveInProvider waveIn=新的NAudio.Wave.WaveInProvider(源流);
waveOut=新的NAudio.Wave.DirectSoundOut();
waveOut.Init(waveIn);
sourceStream.StartRecording();
waveOut.Play();
recordButton.Visible=false;
stopRecord.Visible=true;
}
私有void saveResponse_单击(对象发送方,事件参数e)
{
int deviceNumber=sourceList.SelectedItems[0]。索引;
string saveLocation=“c:\\wav\\sample.wav”;
sourceStream=new NAudio.Wave.WaveIn();
sourceStream.DeviceNumber=设备编号;
sourceStream.WaveFormat=新的NAudio.Wave.WaveFormat(44100,NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);
sourceStream.DataAvailable+=新的事件处理程序(sourceStream\u DataAvailable);
waveWriter=新的NAudio.Wave.waveilewriter(saveLocation,sourceStream.WaveFormat);
sourceStream.StartRecording();
MessageBox.Show(“录制成功保存”);
}
私有void sourceStream_DataAvailable(对象发送方,NAudio.Wave.WaveInEventArgs e)
{
if(waveWriter==null)返回;
waveWriter.WriteData(e.Buffer,0,e.bytes记录);
waveWriter.Flush();
}
私有void stopRecord\u单击(对象发送方,事件参数e)
{
如果(waveOut!=null)
{
waveOut.Stop();
waveOut.Dispose();
waveOut=null;
}
if(sourceStream!=null)
{
sourceStream.StopRecording();
Dispose();
sourceStream=null;
}
if(waveWriter!=null)
{
waveWriter.Dispose();
waveWriter=null;
}
recordButton.Visible=true;
stopRecord.Visible=false;
saveResponse.Enabled=true;
}

您的
录制按钮\u单击
代码不是录制,而是将数据从
波输入
传输到
波输出
,从而将来自源(麦克风)的数据直接播放到输出(扬声器)。它不会保留这些数据供以后使用,只是将数据从一个管道传输到另一个管道。如果您希望随后将该数据保存到磁盘,则需要自己对其进行缓冲

另一方面,
saveResponse\u单击
开始将数据从麦克风直接录制到磁盘上的波形文件。如果您单击
保存响应
按钮,稍等片刻,然后单击
停止
按钮,您应该会得到一个记录的波形文件

如果您想直接记录到磁盘,这很好。如果要记录到内存,然后选择性地写入磁盘,则需要在数据进入时保存数据。可能在记录时使用内存流保存数据,然后在保存文件时将其写入
waveilewriter


下面是我用来测试直接录制到磁盘上的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<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;
}
public WaveIn waveSource=null;
公共波形文件编写器波形文件=空;
私有无效开始单击(对象发送方,事件参数e)
{
StartBtn.Enabled=错误;
StopBtn.Enabled=true;
waveSource=新的WaveIn();
waveSource.WaveFormat=新的波形(44100,1);
waveSource.DataAvailable+=新的EventHandler(waveSource_DataAvailable);
waveSource.RecordingStopped+=新事件处理程序(waveSource\u RecordingStopped);
波形文件=新的波形文件编写器(@“C:\Temp\Test0001.wav”,waveSource.WaveFormat);
波源。开始记录();
}
私有void StopBtn_单击(对象发送方,事件参数e)
{
StopBtn.Enabled=false;
停止记录();
}
无效波源\u数据可用(对象发送器,波因文塔格e)
{
if(波形文件!=null)
{
波形文件写入(e.Buffer,0,e.bytes记录);
waveFile.Flush();
}
}
无效波源\ U记录停止(对象发送器,停止目标e)
{
if(波源!=null)
{
waveSource.Dispose();
波源=零;
}
if(波形文件!=null)
{
Dispose();
波形文件=零;
}
StartBtn.Enabled=真;
}

请显示“停止”操作背后的代码,好吗?只需要看看你是如何关闭waveWriter的。@Corey,我在代码中添加了“停止”操作。干杯。好的,用类似的代码测试过,所有这些似乎都对我有用。您是否在尝试在WMP中播放之前停止录制?我要做的是单击“录制”按钮并录制我的声音,然后单击“停止”按钮,然后单击“保存”按钮。当我点击保存按钮打开wav文件时,没有音频。啊。。。那就可以解释了。我觉得这看起来有点可疑:当我编写代码时,它抛出异常并说“BadDeviceId调用waveInOpen”。有什么建议吗?这是什么错误?@abidinberkay默认设备编号为0,如果该ID不正确,则可能表示您从未插入麦克风。