我有一个.Net Winforms应用程序,我使用NAudio来播放和合并音频文件。
传统上这个应用程序已在PC上运行,音频播放很好。最近有一些请求能够在登录终端服务器时远程运行应用程序。该应用程序工作但音频播放是不稳定的,偶尔音频将退出播放文件的一部分。如果我使用Windows Media Player播放相同的音频文件,则不会起伏不定。
我创建了一个简单的测试应用程序(下面的代码片段),并通过终端服务器连接体验同样的问题播放音频。
当连接到终端服务器与在PC上本地连接时,我应该播放音频吗?或者是否有一些需要调整的设置?
WaveOutEvent wo = new WaveOutEvent();
var wavReader = new WaveFileReader(String.Format(@"{0}\{1}", AssemblyDirectory, "5_3712.wav"));
wo.DeviceNumber = comboSelectDevice.SelectedIndex;
wo.Init(wavReader);
wo.Play();
.Net Framework 3.5
Windows Server 2008 R2
谢谢
解析度
根据Mark Heath的建议,我将默认缓冲区持续时间从300毫秒增加到500毫秒,从终端服务器连接播放时摆脱了不连贯的播放
DesiredLatency
上的WaveOutEvent
属性是缓冲持续时间发生变化的地方。
来自Mark的博客文章之一:Link
“你也可以设置DesiredLatency,它是以毫秒为单位测量的。这个数字实际上设定了所有缓冲区的总持续时间。所以实际上,你可以说真正的延迟更短。在未来的NAudio中,我可以通过替换减少混乱具有BufferDuration属性。默认情况下,DesiredLatency为300ms,这可以确保在大多数计算机上获得流畅的播放体验。您还可以将NumberOfBuffers设置为默认值2以外的值,尽管3是唯一值得使用的其他值“。
更新的代码示例:
WaveOutEvent wo = new WaveOutEvent();
var wavReader = new WaveFileReader(String.Format(@"{0}\{1}", AssemblyDirectory, "5_3712.wav"));
wo.DeviceNumber = comboSelectDevice.SelectedIndex;
wo.DesiredLatency = 500;
wo.Init(wavReader);
wo.Play();
您可以尝试增加默认缓冲区大小以查看是否有帮助。或者您可以尝试使用DirectSoundOut来查看是否有任何区别。您的应用程序中是否有任何可能导致.NET垃圾收集发生的事情?