我很想用 NAudio 来完成这项工作,所以请告诉我是否有办法解决这个问题。我有来自串行设备的流式原始音频,我试图通过 WaveOut 播放。
尝试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。它像贝多芬在奶酪刨丝器上演奏的 5th 一样播放压扩。如果我将 更改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) 处理。