使用 NAudio 操作 mp3 作为数组



我正在尝试重新实现我上周在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(流出),说它不能读取超过流的结束。我想这不是我唯一做错的事。见解吗?

你的代码不工作,因为你从来没有关闭WaveFileWriter,所以它的头写得不正确,你也需要倒带MemoryStream

但是,如果您想要播放一组字节,则不需要编写WAV文件。只需使用RawSourceWaveStream并在您的MemoryStream中传递。

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

最新更新