代码之家  ›  专栏  ›  技术社区  ›  Sean

用NAudio解码mu律音频

  •  2
  • Sean  · 技术社区  · 14 年前

    我试图用NAudio把mu定律编码的音频解码成pcm音频。我的服务是发布原始mu法则编码的音频字节,我从NAudio得到一个错误,数据没有RIFF头。我需要添加这个吗?我使用的代码是:

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

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

    1 回复  |  直到 14 年前
        1
  •  5
  •   Mark Heath    14 年前

    因为您只有原始的mu定律数据,所以不能在上面使用waveilereader。相反,创建一个继承自WaveStream的新类。

    在its中 Read 方法,从tmpMemStream返回数据。作为一个 WaveFormat 返回一个mu定律波形。

    下面是一个可以使用的通用帮助类:

    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);
    }