我的任务是分析一个wav音频文件(过滤,FFT等)。在C#中。目前我正试图正确地将字节转换为双倍,以便用scottplot绘制波形的音频信号,我尝试使用Naudio库,但没有找到任何读取音频数据和绘制它的成功,最终破坏了我的项目。下面的代码是我将wav字节读入数组并将其转换为双精度数组以使用scottplot绘制信号的地方,这不起作用,我使用的是windows forms app(.NET内核)。
byte[] wavData = File.ReadAllBytes(@"C:\Users\me\Documents\africa-song.wav");
double[] values = new double[wavData.Length / 8];
Buffer.BlockCopy(wavData, 0, values, 0, values.Length * 8);
formsPlot1.plt.PlotSignal(values, 44100);如果有更好的库我可以使用或工作来实现这一点,将不胜感激
发布于 2020-12-20 01:24:06
用NAudio从WAV文件中读取值
您可以直接从WAV文件中读取字节,但这并不总是很容易,因为不同的WAV文件具有不同大小的头部,因此您并不总是知道第一个数据字节位于何处。您还必须读取和解释报头,以了解数据格式(每个样本的字节数、是否为浮点等)以及有多少通道。
从WAV文件中读取值的更简单方法是使用NAudio。我使用此方法将任何WAV文件数据的值转换为双精度数组:
static (double[] audio, int sampleRate) ReadWav(string filePath)
{
using var afr = new NAudio.Wave.AudioFileReader(filePath);
int sampleRate = afr.WaveFormat.SampleRate;
int sampleCount = (int)(afr.Length / afr.WaveFormat.BitsPerSample / 8);
int channelCount = afr.WaveFormat.Channels;
var audio = new List<double>(sampleCount);
var buffer = new float[sampleRate * channelCount];
int samplesRead = 0;
while ((samplesRead = afr.Read(buffer, 0, buffer.Length)) > 0)
audio.AddRange(buffer.Take(samplesRead).Select(x => (double)x));
return (audio.ToArray(), sampleRate);
}使用ScottPlot绘制值
与内置的图形库不同,ScottPlot允许对具有数百万个点的数据集进行鼠标交互的平移和缩放,因此即使您的音频文件有一个小时长,您也可以轻松地显示它。看起来你已经非常接近你的原始代码了!
(double[] audio, int sampleRate) = ReadWav("demo.wav");
formsPlot1.plt.PlotSignal(audio, sampleRate);
formsPlot1.plt.Title("WAV File Data");
formsPlot1.plt.XLabel("Time (seconds)");
formsPlot1.plt.YLabel("Audio Value");
formsPlot1.plt.AxisAuto(0);
formsPlot1.Render();

https://stackoverflow.com/questions/64778448
复制相似问题