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