使用NAudio流式传输非PCM原始音频



我一心想用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。它像贝多芬的第五交响曲一样在奶酪刨上演奏。如果我将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)处理。

要使尝试(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也与μ定律无关,因为μ定律块对齐为1。

尝试(3)应该有效。我不知道你所说的缺少标题是什么意思?

在NAudio中,您正在构建一个音频数据管道。管道中的每个阶段都可以有不同的格式。您的音频从Mu定律开始,然后转换为PCM,然后可以播放。缓冲WaveProvider用于即使设备已停止提供音频数据也要继续播放的情况。

编辑我应该补充一点,NAudio中的IWaveProvider接口是一个简化的WaveStream。它只有一种格式和Read方法,在长度未知且无法重新定位的情况下非常有用。

相关内容

  • 没有找到相关文章

最新更新