我在这里有这个代码:
NAudio.Wave.WaveIn sourceStream = null;
NAudio.Wave.DirectSoundOut waveOut = null;
NAudio.Wave.WaveFileWriter waveWriter = null;
private void button3_Click(object sender, RoutedEventArgs e) // Start
{
ShowImage();
sourceStream = new NAudio.Wave.WaveIn();
sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, 2);
NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream);
waveOut = new NAudio.Wave.DirectSoundOut();
waveOut.Init(waveIn);
sourceStream.StartRecording();
}
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 btnStop_Click(object sender, RoutedEventArgs 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;
}
sourceStream = new NAudio.Wave.WaveIn();
sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, 2);
sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable);
waveWriter = new NAudio.Wave.WaveFileWriter(@"../../StoryImages/", sourceStream.WaveFormat);
sourceStream.StopRecording();
}
我做得对吗?我看过教程并试过,但我在编程方面非常弱,这是一个缓冲区的问题,似乎崩溃了我的整个应用程序。它总是说缓冲区已满。
有问题WriteData(e.Buffer,0,e.BytesRecorded);
我正在使用NAudio在WPF中执行此操作,正在使用visual studio 2010。
答案 0 :(得分:0)
也许我错过了解你,但你发布的代码似乎有点非结构化。 在您使用button3_Click开始录制的那一刻,您的WaveWriter仍为空。为什么不在button3_click中创建这个编写器的实例?
总的来说,我建议对对象的创建和处理进行排序。 - &GT; Start方法应包含所有对象创建,以及使用“+ =”添加事件处理程序。 停止按钮处理程序应包含流的所有关闭,并释放资源。
答案 1 :(得分:0)
我认为这里的问题是缓冲区永远不会被清空。 你缺少waveOut.Play();在sourceStream.StartRecording()之后;使缓冲区正确地向下流到扬声器。
此外,您无法在sourceStream_DataAvailable回调中清空缓冲区direclty,因为它是只读的。
如果您不想播放音频,则需要另一个接收器,然后是DirectSoundOut。