我正在尝试重新实现我上周在C#中为项目创建的现有Matlab 8波段均衡器GUI。在Matlab中,歌曲作为动态数组加载到内存中,可以自由操作,播放就像声音(数组)一样简单。
我找到了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)中抛出的错误,它说它无法读取流的末尾。我怀疑这不是我唯一没做的事。任何见解?
答案 0 :(得分:1)
您的代码无效,因为您从未关闭WaveFileWriter
,因此其标题编写不正确,您还需要回放MemoryStream
。
但是,如果要播放一组byes,则无需编写WAV文件。只需使用RawSourceWaveStream
并传入MemoryStream。
您可能还会发现AudioFileReader
类更适合您的需求,因为它会直接将样本提供为浮点数,并允许您修改音量。