c# - Naudio ImaAdpcmWaveFormat,BufferedWaveprovider 不高兴
问题描述
我正在开发一个应用程序,在该应用程序中,我使用 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 用于“位”时,我遇到了类似的问题,但是 4 位/样本应该是 IMA ADPCM 可接受的速率?无论如何,8 位或 16 位/样本的相同例外...
异常数据:
System.DivideByZeroException HResult=0x80020012 消息=尝试除以 zer0。Source=NAudio StackTrace:
在 NAudio.Wave.WaveFormat.ConvertLatencyToByteSize(Int32 毫秒)
在 NAudio.Wave.WaveOut.Init(IWaveProvider waveProvider)
在 USRModemTest.Form1..ctor() 在 C:\Users\c\Source\Repos\ USRModemTest\USRModemTest\Form1.cs:
C:\Users\c\Source\Repos\USRModemTest\USRModemTest\Program.cs 中 USRModemTest.Program.Main() 的第 56 行:第 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 编码的音频。我建议您先将音频解码为 PCM,然后再将其放入BufferedWaveProvider
. 这方面的示例可以在 NAudio 演示项目中找到,您可以使用AcmStream
该类进行转换。
推荐阅读
- python - 如何使用 plotly 离线显示/隐藏带有复选框的子图
- html - 一个 html 元素被另一个重叠。如何解决?
- jquery - Ajax 使用外部 ajax 函数获取数据
- node.js - App Engine Node.js:如何链接应用日志和请求日志
- react-native - 如何在 React Native 中获取被点击元素的样式名称和状态名称?
- c# - 从 DAL 返回通用列表
- c# - C# WPF 如何在 MultiBinding 中使用自定义 ComboBox 项属性
- docker - 在 docker compose build 中定义预处理器变量
- python - 带有自定义消息的 Python Telegram 机器人回调不起作用
- python - tkinter.Text() 错误(_tkinter.TclError:预期的整数,得到“sans”)