在 NAudio 中附加 WAV Header

Append WAV Header in NAudio

我正在尝试将音频 MP3 文件转换为标准速率(48 KHz,16 位,2 通道)的 WAV,方法是使用 "MediaFoundationReaderRT" 打开并在其中指定标准设置。

文件转换为 PCM WAV 后,当我尝试播放 WAV 文件时,它给出损坏的输出:

选项 1 -

WaveStream activeStream = new MediaFoundationReaderRT([Open "MyFile.mp3"]);
WaveChannel32 waveformInputStream = new WaveChannel32(activeStream);

waveformInputStream.Sample += inputStream_Sample;

我注意到,如果我将音频数据读入内存流(其中它通过 "WaveFileWriter" 附加 WAV header),那么一切正常:

选项 2 -

WaveStream activeStream = new MediaFoundationReaderRT([Open "MyFile.mp3"]);

MemoryStream memStr = new MemoryStream();
byte[] audioData = new byte[activeStream.Length];
int bytesRead = activeStream.Read(audioData, 0, audioData.Length);
memStr.Write(audioData, 0, bytesRead);

WaveFileWriter.CreateWaveFile(memStr, audioData);

RawSourceWaveStream rawSrcWavStr = new RawSourceWaveStream(activeStream, 
new WaveFormat(48000, 16, 2));
WaveChannel32 waveformInputStream = new WaveChannel32(rawSrcWavStr);

waveformInputStream.Sample += inputStream_Sample;

然而,将整个音频读入内存是time-consuming。因此,如上所述,我正在查看 "Option 1"。

我想弄清楚到底是什么问题。是 WAV header 丢失导致了问题吗?

在 "Option 1" 中有没有一种方法可以将 WAV header 附加到 "current playing" 样本数据,而不是将整个音频数据转换为内存流,然后附加header?

我不太确定您为什么需要这些选项中的任何一个。使用 NAudio 将 MP3 文件转换为 WAV 非常简单:

using(var reader = new MediaFoundationReader("input.mp3"))
{
    WaveFileWriter.CreateWaveFile("output.wav", reader);
}

如果您不需要创建 WAV 文件,那么您的工作就已经完成了 - MediaFoundationReader 已经通过 Read 方法 returns PCM,因此您可以直接播放它。