在NAudio中添加WAV Header

本文关键字:WAV Header 添加 NAudio | 更新日期: 2023-09-27 17:51:11

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

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

选项1 -

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

我注意到,如果我读取音频数据到内存流(其中它通过"WaveFileWriter"附加WAV头),那么事情工作得很好:

选项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;

然而,将整个音频读入内存非常耗时。因此,我正在考虑如上所述的"选项1"。

我想弄清楚到底是什么问题。是不是WAV头丢失了导致问题的原因?

在"选项1"中是否有一种方法,我可以将WAV标头附加到"当前播放"样本数据,而不是将整个音频数据转换为内存流,然后附加标头?

在NAudio中添加WAV Header

我不太确定为什么需要这两个选项。使用NAudio:

将MP3文件转换为WAV非常简单
using(var reader = new MediaFoundationReader("input.mp3"))
{
    WaveFileWriter.CreateWaveFile("output.wav", reader);
}

如果你不需要创建一个WAV文件,那么你的工作已经完成- MediaFoundationReader已经从它的Read方法返回PCM,所以你可以直接播放它。