我想播放一个声音样本(大约2分钟)并在播放样本时记录击键。我需要知道按键相对于播放开始时间的确切时间,分辨率为1毫秒或更短。
首先,我尝试了NAudio和Winforms应用程序。我发现同步播放开始时间和按键时间是不可能的。我知道什么时候我开始将样本字节传输到NAudio,而不是传递样本和实际播放之间的时间。我也知道我的应用程序收到KeyDown事件的时间,但不知道事件从键盘硬件到我的C#事件处理程序的所有时间。
这或多或少准确 - 我在应用程序报告的延迟和实际延迟之间得到270毫秒(+ - 5毫秒)的延迟(我通过记录会话和查看示例文件来了解实际的延迟。是在不同的设备上完成的,而不是运行应用程序的计算机...)。
由于+ - 5ms,这还不够好。即使我在播放期间禁用了第2代GC,也会发生这种情况。我需要比这更准确。
我不介意切换到C ++和非托管代码,但我想知道要使用哪种声音播放API,以及是否有更准确的方法来获取键盘输入而不是等待WM_KEYDOWN消息。
答案 0 :(得分:1)
使用NAudio,所有实现IWavePosition
接口的输出设备都可以准确地报告播放位置的确切位置。可能需要一些试验和错误才能准确了解如何将位置转换为时间,但这是解决此问题的最佳方法。