我正在尝试重新实现我上周在 C# 中为一个项目创建的现有 Matlab 8 波段均衡器 GUI。在 Matlab 中,歌曲作为动态数组加载到内存中,可以在内存中自由操作,播放就像 sound(array) 一样简单。
我发现 NAudio 库已经很方便地定义了 Mp3 提取器、播放器以及卷积和 FFT。我能够打开 Mp3 并将其所有数据读入一个数组(尽管我不确定我是否正确。)但是,即使在查看了几个示例之后,我也很难弄清楚如何获取数组并将其写回流中,以便正确播放(我不需要写入文件)。
按照我找到的例子,我读我的mp3是这样的:
private byte[] CreateInputStream(string fileName)
{
byte[] stream;
if (fileName.EndsWith(".mp3"))
{
WaveStream mp3Reader = new Mp3FileReader(fileName);
songFormat = mp3Reader.WaveFormat; // songFormat is a class field
long sizeOfStream = mp3Reader.Length;
stream = new byte[sizeOfStream];
mp3Reader.Read(stream, 0, (int) sizeOfStream);
}
else
{
throw new InvalidOperationException("Unsupported Exception");
}
return stream;
}
现在我有一个大概包含原始音频数据的字节数组,我打算最终将其转换为浮点数以便通过 DSP 模块运行。然而,现在,我只是想看看我是否可以播放字节数组。
Stream outstream = new MemoryStream(stream);
WaveFileWriter wfr = new WaveFileWriter(outstream, songFormat);
// outputStream is an array of bytes and a class variable
wfr.Write(outputStream, 0, (int)outputStream.Length);
WaveFileReader wr = new WaveFileReader(outstream);
volumeStream = new WaveChannel32(wr);
waveOutDevice.Init(volumeStream);
waveOutDevice.Play();
现在我收到 WaveFileReader(outstream) 中抛出的错误,它说它无法读取流的末尾。我怀疑这不是我做错的唯一事情。有什么见解吗?