我试图通过打开“MediaFoundationReaderRT”并指定其中的标准设置,以标准速率(48 KHz,16位,2个通道)将音频MP3文件转换为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标题附加到“当前播放”的样本数据,而不是将整个音频数据转换为内存流然后附加标题?
答案 0 :(得分:2)
我不太确定你为什么需要这些选项。使用NAudio:将MP3文件转换为WAV非常简单:
using(var reader = new MediaFoundationReader("input.mp3"))
{
WaveFileWriter.CreateWaveFile("output.wav", reader);
}
如果您不需要创建WAV文件,那么您的工作已经完成 - MediaFoundationReader已经从它的Read
方法返回PCM,因此您可以直接播放它。