C# naudio从麦克风录制声音,然后保存
我对naudio和保存录音有一些问题。我目前拥有的代码可以保存wav文件,但当我打开它时,Windows Media Player返回一个错误:“Windows Media Player在播放该文件时遇到问题” 我有两个按钮,一个“记录”按钮,按下后会变成停止按钮。我有一个“Save”(保存)按钮,单击该按钮时,会将录制保存到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
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不正确,则可能表示您从未插入麦克风。