gpt4 book ai didi

c# - 录音波 naudio 图书馆 - 音质差

转载 作者:太空宇宙 更新时间:2023-11-03 14:00:51 25 4
gpt4 key购买 nike

我正在使用 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); 会停止应用程序。

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com