2011-08-05 188 views
2

我正在嘗試開發一個應用程序,其中建立一個SIP呼叫,然後我捕獲rtp音頻數據包。由於它們是編碼的,所以我需要解碼它們並保存它.wav文件。嘗試使用NAudio,但沒有工作。有沒有使用NAudio或任何其他來源解決此問題的解決方案...如何解碼RTP數據包並保存它有.wav文件

我使用的代碼如下。 data是rtp分組數據所在的字節數組。

System.IO.MemoryStream stream = new System.IO.MemoryStream(data); 

RawSourceWaveStream rsws = new RawSourceWaveStream(stream, WaveFormat.CreateMuLawFormat(8000,1)); 

WaveStream conversionStream = WaveFormatConversionStream.CreatePcmStream(rsws); 

WaveStream blockAlignedStream = new BlockAlignReductionStream(conversionStream); 

byte[] buffer = new byte[udpHeader.Data.Length]; 
blockAlignedStream.Read(buffer, 0, udpHeader.Data.Length); 
writer.WriteData(buffer, 0, buffer.Length); 

在此先感謝。

+0

爲了幫助我們更好地回答您,您能否提供您嘗試過的NAudio代碼? –

+0

我編輯了我的問題,並在那裏添加了我的代碼 –

+1

什麼對代碼不起作用? (順便說一句,你不需要BlockAlignReductionStream)。您還需要使用Read方法返回 - 轉換後的音頻將是原始數據長度的兩倍 –

回答

0

比從未更好的遲到!

Using NAudio to decode mu-law audio

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

使用由馬克·希思 以下幫手班組長從

http://naudio.codeplex.com/

然後獲取最新NAudio.dll和NAudio.WindowsMediaFormat.dll

按照以下步驟將U-Law或Mu-Law轉換成Wa v:

Stream tmpMemStream = new FileStream(Server.MapPath("/input/") + "input.voc", FileMode.Open, FileAccess.Read); 
var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1); // Feel free to tweak this number 
var reader = new RawSourceWaveStream(tmpMemStream, waveFormat); 
using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) 
{ 
    WaveFileWriter.CreateWaveFile(Server.MapPath("/output/") + "output.wav", convertedStream); 
} 
tmpMemStream.Close(); 

只記得尊重這些音頻文件的所有者的隱私!