1

我在这里有这个代码:

 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。

4

2 回答 2

0

也许我误解了你,但你发布的代码似乎有点非结构化。在您使用 button3_Click 开始录制的那一刻,您的 WaveWriter 仍然为空。为什么不在 button3_click 中创建这个 writer 的实例?

总的来说,我建议对您的对象创建和处置进行排序。-> Start 方法应该包含所有对象的创建,以及使用“+=”添加事件处理程序。停止按钮处理程序应包含所有流的关闭和释放资源。

于 2013-07-08T03:14:36.203 回答
0

我认为这里的问题是缓冲区永远不会被清空。您缺少 waveOut.Play(); 在 sourceStream.StartRecording() 之后;使缓冲区正确地流向扬声器。

此外,您不能在 sourceStream_DataAvailable 回调中清空缓冲区,因为它是只读的。

如果您不想播放音频,则需要另一个接收器,然后是 DirectSoundOut。

于 2016-02-23T16:40:12.933 回答