Naudio ImaAdpcmWaveFormat,BufferedWaveprovider不高兴

问题描述 投票:1回答:1

我正在开发一个应用程序,我使用Naudio播放流向/来自调制解调器的声音(在这个特定的调制解调器上没有运气,所以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而不是“bit”,但4位/样本应该是IMA ADPCM的可接受速率?无论如何,8或16位/样本的相同异常......

例外数据:

System.DivideByZeroException HResult = 0x80020012 Message =尝试除以zer0。 Source = 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行 在C:\ Users \ c \ Source \ Repos \ USRModemTest \ USRModemTest \ Program.cs中的USRModemTest.Program.Main():第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);
c# audio naudio
1个回答
1
投票

您无法直接播放使用IMA ADPCM编码的音频。我建议您在将音频放入BufferedWaveProvider之前将其解码为PCM。可以在NAudio演示项目中找到此示例,您可以使用AcmStream类进行转换。

© www.soinside.com 2019 - 2024. All rights reserved.