Naudio ImaAdpcmWaveFormat,BufferedWaveprovider不满意

时间:2019-03-21 10:55:17

标签: c# audio naudio

我正在开发一个应用程序,在该应用程序中,我使用Naudio播放到/从调制解调器传来的声音(在此特定的调制解调器上,没有Tapi的运气,所以AT命令)。

当我使用线性波形时(WaveFormat waveFormat = new WaveFormat(8000,16,1);),这可以很好地工作,但是现在我想尝试获得全双工,这意味着使用稍微更有效的声音格式可能一个好主意。

看到Naudio具有ImaAdpcmWaveFormat,因此尝试用该对象替换WaveFormat对象(ImaAdpcmWaveFormat imaadpcm_waveformat = new ImaAdpcmWaveFormat(8000,1,4);)。

但是,现在waveout.init抛出System.DivideByZeroException:(。

当我设法误读了WaveFormat的规格并将2(而不是16)用于“位”时,我遇到了类似的问题,但是IMA ADPCM可接受的速率是4位/样本吗?无论如何,同样的例外是8位或16位/样本...

异常数据:

  

System.DivideByZeroException   HResult = 0x80020012   消息=尝试除以zer0。   来源= NAudio   StackTrace:
    在NAudio.Wave.WaveFormat.ConvertLatencyToByteSize(Int32毫秒)
    在NAudio.Wave.WaveOut.Init(IWaveProvider waveProvider)
    在C:\ Users \ c \ Source \ Repos \ USRModemTest \ USRModemTest \ Form1.cs:USRModemTest.Form1..ctor()中:行56
    在USRModemTest.Program.Main()中的C:\ Users \ c \ Source \ Repos \ USRModemTest \ USRModemTest \ Program.cs:line 19

来自构造函数:

请注意,如果我用waveFormat替换imaadpcm_waveformat,效果会很好

//waveFormat = new WaveFormat(8000, 16, 1);
imaadpcm_waveformat = new ImaAdpcmWaveFormat(8000, 1, 4);

//bwp_ModemToSpeakers = new BufferedWaveProvider(waveFormat);
bwp_ModemToSpeakers = new BufferedWaveProvider(imaadpcm_waveformat);
bwp_ModemToSpeakers.DiscardOnBufferOverflow = true;
//bwp_ModemToSpeakers.BufferDuration = System.TimeSpan.FromMilliseconds(200);
bwp_ModemToSpeakers.ReadFully = true;
bwp_ModemToSpeakers.BufferLength = 1000 ; // as small as possible it seems

waveout = new WaveOut();
waveout.DeviceNumber = -1; // default communications device
waveout.DesiredLatency = 200;
waveout.Init(bwp_ModemToSpeakers);

1 个答案:

答案 0 :(得分:1)

您不能直接播放使用IMA ADPCM编码的音频。建议您先将音频解码为PCM,然后再将其放入BufferedWaveProvider。这样的示例可以在NAudio演示项目中找到,您可以使用AcmStream类进行转换。