使用NAudio解码mu-law音频

我正在尝试使用NAudio将mu-law编码音频解码为pcm音频。 我的服务是POST原始mu-law编码的音频字节,我从NAudio得到一个错误,数据没有RIFF标题。 我需要以某种方式添加它吗? 我正在使用的代码是:

WaveFileReader reader = new WaveFileReader(tmpMemStream); using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) { WaveFileWriter.CreateWaveFile(recordingsPath + "/" + outputFileName, convertedStream); } 

我也将原始数据保存到磁盘并在Matlab中进行解码,这没有问题。 谢谢。

由于您只有原始的mu-law数据,因此无法在其上使用WaveFileReader。 而是创建一个inheritance自WaveStream的新类。

在其Read方法中,从tmpMemStream返回数据。 作为WaveFormat返回一个mu-law WaveFormat。

这是一个你可以使用的通用助手类:

 public class RawSourceWaveStream : WaveStream { private Stream sourceStream; private WaveFormat waveFormat; public RawSourceWaveStream(Stream sourceStream, WaveFormat waveFormat) { this.sourceStream = sourceStream; this.waveFormat = waveFormat; } public override WaveFormat WaveFormat { get { return this.waveFormat; } } public override long Length { get { return this.sourceStream.Length; } } public override long Position { get { return this.sourceStream.Position; } set { this.sourceStream.Position = value; } } public override int Read(byte[] buffer, int offset, int count) { return sourceStream.Read(buffer, offset, count); } } 

现在,您可以像以前一样继续创建转换后的文件,并将RawSourceWaveStream作为输入传递:

 var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1); var reader = new RawSourceWaveStream(tmpMemStream, waveFormat); using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) { WaveFileWriter.CreateWaveFile(recordingsPath + "/" + outputFileName, convertedStream); }