2011-06-16 124 views
1

我非常想用NAudio來做這項工作,所以請告訴我是否有解決方法。我已經通過串口設備傳輸原始音頻,我試圖通過WaveOut播放。使用NAudio播放非PCM原始音頻

嘗試1:

'Constants 8000, 1, 8000 * 1, 1, 8 
Dim CustomWaveOutFormat = WaveFormat.CreateCustomFormat(WaveFormatEncoding.Pcm, SampleRate, Channels, AverageBPS, BlockAlign, BitsPerSample)  
Dim rawStream = New RawSourceWaveStream(VoicePort.BaseStream, CustomWaveOutFormat) 

'Run in background 
Dim waveOut = New WaveOut(WaveCallbackInfo.FunctionCallback()) 

'Play stream 
waveOut.Init(rawStream) 
waveOut.Play() 

此代碼的工作,但有一個小問題 - 實際的音頻流不是原始PCM,它的原料MuLaw。它像貝多芬在奶酪刨上的第5場一樣奏效。如果我將WaveFormat更改爲WaveFormatEncoding.MuLaw,則會得到格式不正常的異常,因爲它是原始音頻,並且沒有RIFF標頭。

於是我搬了將其轉換爲PCM:

嘗試2:

Dim reader = New MuLawWaveStream(VoicePort.BaseStream, SampleRate, Channels) 
Dim pcmStream = WaveFormatConversionStream.CreatePcmStream(reader) 
Dim waveOutStream = New BlockAlignReductionStream(pcmStream) 

waveOut.Init(waveOutStream) 

這裏,CreatePcmStream嘗試獲取流(即使CanSeek = FALSE)和失敗的長度。

嘗試3

waveOutStream = New BufferedWaveProvider(WaveFormat.CreateMuLawFormat(SampleRate, Channels)) 
*add samples when OnDataReceived()* 

它也似乎缺乏有頭的受苦。

我希望有一些小事我錯過了所有這一切。設備僅在使用時流式傳輸音頻,否則不會收到任何數據 - 由(1)處理的情況。

+0

問題[使用NAudio解碼mu律音頻](http://stackoverflow.com/questions/4234665/using-naudio-to-decode-mu-law-audio)非常相似,但流長度在那種情況下是已知的。 – Asti 2011-06-16 19:55:58

回答

2

爲了嘗試(1)的工作,你應該RawSourceWaveStream指定格式的數據真的是那麼就使用另一種WaveFormatConversionStream.CreatePcmStream,以rawStream作爲輸入:

Dim muLawStream = New RawSourceWaveStream(VoicePort.BaseStream, WaveFormat.CreateMuLawFormat(SampleRate, Channels)) 
Dim pcmStream = WaveFormatConversionStream.CreatePcmStream(muLawStream); 

嘗試(2)實際上非常接近工作。你只需要讓MuLawStream.Length返回0.你不需要它爲你正在做的事情。 BlockAlignReductionStream與mu-law無關,因爲mu law block align爲1.

嘗試(3)應該有效。我不知道你的意思是缺少頭部?

在NAudio中,您正在構建音頻數據流水線。管道中的每個階段都可以有不同的格式。您的音頻以Mu-law開始,然後轉換爲PCM,然後可以播放。使用緩衝WaveProvider即使您的設備已停止提供音頻數據,也希望您可以繼續播放。

編輯我應該補充說NAudio中的IWaveProvider接口是一個簡化的WaveStream。它只有一種格式和一種Read方法,對於長度未知且無法重新定位的情況非常有用。

+0

謝謝馬克。我確實重寫了長度以返回零,但該設備在該時間點沒有發送任何數據(原因未知),所以我認爲可能長度對於wave提供商是必需的。 – Asti 2011-06-17 12:46:26

+0

IWaveProvider是一個簡化的WaveStream,增加了很多清晰度。 – Asti 2011-06-17 12:47:58