使用NAudio将Mp3作为数组进行操作

时间:2013-05-14 19:33:16

标签: c# signal-processing 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)中抛出的错误,它说它无法读取流的末尾。我怀疑这不是我唯一没做的事。任何见解?

1 个答案:

答案 0 :(得分:1)

您的代码无效,因为您从未关闭WaveFileWriter,因此其标题编写不正确,您还需要回放MemoryStream

但是,如果要播放一组byes,则无需编写WAV文件。只需使用RawSourceWaveStream并传入MemoryStream。

您可能还会发现AudioFileReader类更适合您的需求,因为它会直接将样本提供为浮点数,并允许您修改音量。