c# - 录音波 naudio 库 - 声音质量很差

标签 c# .net audio naudio wave

我正在使用 naudio 学习音频编程(使用教程)。我的程序(C# .net winForms)我有记录和停止按钮。代码如下所示:

    NAudio.Wave.WaveIn sourceStream = null;
    NAudio.Wave.WaveFileWriter waveWriter = null;

    private void RecordButton_Click(object sender, EventArgs e)
    {
        int deviceNumber = 0;
        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("d:\\a.wav", sourceStream.WaveFormat);

        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 StopButton_Click(object sender, EventArgs e)
    { 
            waveWriter.Dispose();
            waveWriter = null;       
    }

它可以工作,但波形文件质量不好 - 我录制的声音中有小间隙。我想要 44100 Hz 采样率和 16 位采样格式。

最佳答案

我无法完全复制您发现的内容,但我确实注意到 DataAvailable 事件并没有为其他操作留下太多空间。一个简单的 Thread.Sleep(100); 会停止应用程序。

假设您的连续写入(和刷新)可能会导致问题,我实现了一个简单的队列,它保留要写入的字节并使用线程池中的线程来进行实际写入。

DataAvailable 事件现在如下所示:

    Queue<byte[]> writebuffer = new Queue<byte[]>();

    private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
    {
        if (waveWriter == null) return;

        byte[] realbytes = new byte[e.BytesRecorded];
        Array.Copy(e.Buffer, realbytes, e.BytesRecorded);
        writebuffer.Enqueue(realbytes);
    }

StartRecording 调用之后,我将任务排队以读取队列并将数据写入流。如果我添加延迟,应用程序将不再停止。

ThreadPool.QueueUserWorkItem((s) =>
{
    var keeprunning = true;
    sourceStream.RecordingStopped += (rss, rse) => { keeprunning = false; };
    while(keeprunning)
    {
        if (writebuffer.Count==0)
        {
                Thread.Sleep(0);
        }
        else
        { 
            var buf = writebuffer.Dequeue();
            waveWriter.Write(buf,0,buf.Length);
            // Thread.Sleep(100); // for testing 
        }
    }
    waveWriter.Dispose();
    waveWriter = null;
});

关于c# - 录音波 naudio 库 - 声音质量很差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10742184/

相关文章:

java - 如何根据微调器值将音频保存在SD卡中

c# - 仅在 DataGridView 的某一列上使用手形光标

c# - 在 C#、SQL 2008 中脚本下载数千个文件的最佳方法

c# - 如何确定图像中的最大颜色?

c# - 当一个对象从 MarshalByRefObject 派生并且也被标记为 [Serializable] 时会发生什么?

c# - 错误一侧的货币符号

c# - 如何在 uwp 应用程序中单击后退按钮导航到特定的数据透视项

c# - 如何使用 WinSCP .NET 程序集上传文件到家里?

javascript - 使用 Jquery 的多实例音频播放/暂停

javascript - 如何在 HTML5 静音按钮中应用淡入淡出效果