0

私はこれを 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 です。チーズおろし器でベートーベンの第5番のようにコンパンディングを演奏します。を に変更するWaveFormatWaveFormatEncoding.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) で処理されるケース。

4

1 に答える 1

3

試行 (1) を機能させるには、RawSourceWaveStream で実際のデータの形式を指定する必要があります。次に、別の WaveFormatConversionStream.CreatePcmStream を使用して、rawStream を入力として取得します。

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

試行 (2) は、実際には動作に非常に近いです。MuLawStream.Length が 0 を返すようにするだけで済みます。実行している内容には必要ありません。Mu法ブロック整列は1であるため、BlockAlignReductionStreamはmu-法にも無関係です。

試み(3)はうまくいくはずです。ヘッダーがないとはどういう意味ですか?

NAudio では、オーディオ データのパイプラインを構築しています。パイプラインの各ステージは、異なる形式を持つことができます。オーディオは Mu-law で始まり、PCM に変換されてから再生できます。バッファリングされた WaveProvider は、デバイスがオーディオ データの提供を停止した場合でも再生を継続するために使用されます。

編集NAudio の IWaveProvider インターフェイスは単純化された WaveStream であることを追加する必要があります。フォーマットと Read メソッドしかなく、Length が不明で再配置できない状況で役立ちます。

于 2011-06-16T19:56:31.910 に答える