我非常想用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