0
votes

I am trying to convert audio MP3 files to WAV with a standard rate (48 KHz, 16 bits, 2 channels) by opening with "MediaFoundationReaderRT" and specifying the standard settings in it.

After the file is converted to PCM WAV, when I try to play the WAV file, it gives corrupt output:

Option 1 -

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

waveformInputStream.Sample += inputStream_Sample;

I noticed that if I read the audio data into a memory stream (wherein it appends the WAV header via "WaveFileWriter"), then things work fine:

Option 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;

However, reading the whole audio into memory is time-consuming. Hence I am looking at "Option 1" as noted above.

I am trying to figure out as to what exactly is the issue. Is it that the WAV header is missing which is causing the problem?

Is there a way in "Option 1" where I can append the WAV header to the "current playing" sample data, instead of converting the whole audio data into memory stream and then appending the header?

1

1 Answers

3
votes

I'm not quite sure why you need either of those options. Converting an MP3 file to WAV is quite simple with NAudio:

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

And if you don't need to create a WAV file, then your job is already done - MediaFoundationReader already returns PCM from it's Read method so you can play it directly.