1

我正在尝试重新实现我上周在 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) 中抛出的错误,它说它无法读取流的末尾。我怀疑这不是我做错的唯一事情。有什么见解吗?

4

1 回答 1

1

您的代码无法正常工作,因为您从不关闭 ,WaveFileWriter因此它的标头没有正确编写,并且您还需要倒带MemoryStream.

但是,如果您想播放字节数组,则无需编写 WAV 文件。只需使用 aRawSourceWaveStream并传入您的 MemoryStream。

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

于 2013-05-15T07:07:08.383 回答