Naudio ImaAdpcmWaveFormat,BufferedWaveprovider 不开心
Naudio ImaAdpcmWaveFormat, BufferedWaveprovider not happy
我正在开发一个应用程序,在该应用程序中我使用 Naudio 播放流式传输的声音 to/from 一个调制解调器(在这个特定的调制解调器上没有 tapi,所以 AT 命令)。
当我使用线性波形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 用于 "bits" 时,我遇到了类似的问题,但是 4 bits/sample 应该是 IMA ADPCM 可接受的速率?无论如何,8 或 16 bits/sample...
的相同例外
异常数据:
System.DivideByZeroException
HResult=0x80020012
Message=Attempted to divide by zer0.
Source=NAudio
StackTrace:
at NAudio.Wave.WaveFormat.ConvertLatencyToByteSize(Int32 milliseconds)
at NAudio.Wave.WaveOut.Init(IWaveProvider waveProvider)
at USRModemTest.Form1..ctor() in C:\Users\c\Source\Repos\USRModemTest\USRModemTest\Form1.cs:line 56
at USRModemTest.Program.Main() in C:\Users\c\Source\Repos\USRModemTest\USRModemTest\Program.cs:line 19
来自构造函数:
请注意,如果我将 imaadpcm_waveformat 替换为 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);
您无法直接播放使用 IMA ADPCM 编码的音频。我建议您在将音频放入 BufferedWaveProvider
之前将其解码为 PCM。可以在 NAudio 演示项目中找到这方面的示例,您可以使用 AcmStream
class 进行转换。
我正在开发一个应用程序,在该应用程序中我使用 Naudio 播放流式传输的声音 to/from 一个调制解调器(在这个特定的调制解调器上没有 tapi,所以 AT 命令)。
当我使用线性波形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 用于 "bits" 时,我遇到了类似的问题,但是 4 bits/sample 应该是 IMA ADPCM 可接受的速率?无论如何,8 或 16 bits/sample...
的相同例外异常数据:
System.DivideByZeroException HResult=0x80020012 Message=Attempted to divide by zer0. Source=NAudio StackTrace:
at NAudio.Wave.WaveFormat.ConvertLatencyToByteSize(Int32 milliseconds)
at NAudio.Wave.WaveOut.Init(IWaveProvider waveProvider)
at USRModemTest.Form1..ctor() in C:\Users\c\Source\Repos\USRModemTest\USRModemTest\Form1.cs:line 56
at USRModemTest.Program.Main() in C:\Users\c\Source\Repos\USRModemTest\USRModemTest\Program.cs:line 19
来自构造函数:
请注意,如果我将 imaadpcm_waveformat 替换为 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);
您无法直接播放使用 IMA ADPCM 编码的音频。我建议您在将音频放入 BufferedWaveProvider
之前将其解码为 PCM。可以在 NAudio 演示项目中找到这方面的示例,您可以使用 AcmStream
class 进行转换。