2010-11-20 88 views
2

我試圖使用NAudio解碼畝法編碼音頻成PCM音頻。我的服務被張貼了原始的mu-law編碼的音頻字節,並且我從NAudio得到一個錯誤,表示數據沒有RIFF頭。我需要添加這個不知何故?我正在使用的代碼是:使用NAudio解碼畝法音頻

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

我還保存原始數據到磁盤,做在Matlab這正與沒問題的解碼。謝謝。

回答

3

由於您只有原始的mu律法數據,因此您無法在其上使用WaveFileReader。相反,創建一個從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); 
} 
+0

謝謝你馬克!這工作完美。 – Sean 2010-11-21 13:03:35

+0

如果我的tmpMemStream是一個文件呢? – Har 2012-06-27 15:22:45