[英]Manipulating Mp3's as Array Using NAudio
我正在尝试重新实现上周在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)中引发了错误,该错误表示无法读取流的末尾。 我怀疑这不是我做不正确的唯一事情。 有什么见解吗?
您的代码无法正常工作,因为您从未关闭WaveFileWriter
因此其标题未正确编写,并且还需要倒带MemoryStream
。
但是,如果要播放再见数组,则无需编写WAV文件。 只需使用RawSourceWaveStream
并传递您的MemoryStream。
您可能还会发现AudioFileReader
类更适合您的需求,因为它将直接提供样本作为浮点,并允许您修改音量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.