私はこれを 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番のようにコンパンディングを演奏します。を に変更する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) で処理されるケース。