首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NAudio记录

NAudio记录
EN

Stack Overflow用户
提问于 2013-07-08 02:56:12
回答 2查看 1.6K关注 0票数 1

我这里有个密码:

代码语言:javascript
复制
 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中做这件事,使用2010。

EN

回答 2

Stack Overflow用户

发布于 2013-07-08 03:14:36

也许我想你,但你发布的代码似乎有点不结构化。在您使用button3_Click开始录制时,您的WaveWriter仍然为空。你为什么不在button3_click中创建一个作者的实例呢?

总之,我建议对您的对象创建和处理进行排序。-> Start方法应该包含所有对象创建,以及添加带有"+=“的事件处理程序。停止按钮处理程序应该包含流的所有关闭,并释放重新源。

票数 0
EN

Stack Overflow用户

发布于 2016-02-23 16:40:12

我认为这里的问题是缓冲区从来没有被清空过。您缺少了waveOut.Play();在sourceStream.StartRecording()之后;以使缓冲区正确地流向扬声器。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17518587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档