在 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,因此您可以直接播放它。
我正在尝试将音频 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,因此您可以直接播放它。