Я чертовски стремлюсь сделать эту работу с 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).