我正在开发一个应用程序,在该应用程序中,我使用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);
答案 0 :(得分:1)
您不能直接播放使用IMA ADPCM编码的音频。建议您先将音频解码为PCM,然后再将其放入BufferedWaveProvider
。这样的示例可以在NAudio演示项目中找到,您可以使用AcmStream
类进行转换。