在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:
将MP3文件转换为WAV非常简单using(var reader = new MediaFoundationReader("input.mp3"))
{
WaveFileWriter.CreateWaveFile("output.wav", reader);
}
如果你不需要创建一个WAV文件,那么你的工作已经完成- MediaFoundationReader已经从它的Read
方法返回PCM,所以你可以直接播放它。