windows - WASAPI 独占模式不规则回调
问题描述
很长一段时间以来,我们已经注意到在独占、事件驱动模式下使用 WASAPI 会导致不规则的回调周期。在不显示每个人都用作基线的“相同旧”代码(Microsoft 示例)的情况下,我们做了以下事情(为简单起见硬编码):
m_AudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE,
AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
40000,
40000,
m_MixFormat,
nullptr);
请注意,所有设备报告的最小设备周期为 30000,因此我们可以使用此代码。混音格式只是一个标准的 16 位双通道 PCM 设置,没什么特别的。
这工作正常,并且让我们的回调在我们正常处理音频的地方正常运行。
但是,我们很难真正获得 4 毫秒的延迟。所以我们在渲染回调中放了一些计时代码,注意到回调的平均时间实际上是 4ms,但个别回调时间如下所示(时间略有不同,但这是典型的):
9.867 毫秒 .089 毫秒 9.929 毫秒 .088 毫秒 .090 毫秒 9.803 毫秒 .093 毫秒 9.909 毫秒 .063 毫秒 .069 毫秒。. .
我们原本预计每个呼叫以大约 4 毫秒的间隔到达。问题是,如果我们试图尽可能快地传送音频而不会丢失,我们就无法保持 4ms 的速率。实际上,我们不能真正指望以 10 毫秒左右的速度传输音频,因为有时似乎需要将近 10 毫秒才能触发我们的回调。
使用 AvmSetThreadCharacteristics 或 MFLockSharedWorkQueue 将所有线程设置为“Pro Audio”。
我们已经使用 IAudioClient 和 IAudioClient3 以及来自多个制造商的多个设备(但都是 USB 设备)完成了此操作。
这是与驱动程序相关的问题吗?我们使用的设备是 Realtek USB、Motu M2、Focusrite 18i8、RME Babyface Pro FS 等。他们都表现出这种行为。
解决方案
推荐阅读
- c++ - 使用指针在 OpenCV 中上传图像
- rest - 无法更新/添加/删除用户到 Ranger 中的组
- android - Flowable订阅在插入记录后获取空列表
- spring - Spring Pagination sorting with cases
- security - RSA 公钥以什么格式通过 Internet 发送?
- tsql - 联结表上的 tsql update trigger1 更新主表,主表更新 trigger2 尝试更新主表中同一行上的其他列 - 失败
- javascript - 如何在不损失质量的情况下扩大图像?
- python - 如何
从 Python 爬取中删除 - express - Vue/Vuex - 如何在路由更改后保持用户身份登录
- firebase - Flutter for Auth 的 Firebase UI