• 调研音频延时问题


    已知:

    Windows 音频会话 API (WASAPI)

    从 Windows 10 开始,WASAPI 已增强为:

    • 允许应用程序发现给定音频设备的音频驱动程序支持的缓冲区大小范围(即周期性值)。这使应用程序可以在共享模式下打开流时在默认缓冲区大小 (10 毫秒) 或小缓冲区 (<10 毫秒) 之间进行选择。如果应用程序未指定缓冲区大小,则它将使用默认缓冲区大小。
    • 允许应用程序发现音频引擎的当前格式和周期。这允许应用程序捕捉到音频引擎的当前设置。
    • 允许应用程序指定它希望以其指定的格式呈现/捕获,而无需音频引擎进行任何重新采样

    上述功能将在所有 Windows 设备上可用。但是,具有足够资源和更新驱动程序的某些设备将提供比其他设备更好的用户体验。

    上述功能由一个名为IAudioClient3的新接口提供,该接口源自IAudioClient2

    Windows 10已经在三个方面进行了改进,以减少延迟

    1. 与Windows 8.1相比,所有使用音频的应用程序的往返延迟将减少4.5-16毫秒(如上节所述),而无需改变任何代码或更新驱动程序
    2. 更新了驱动程序的系统将提供更低的往返延迟:a. 驱动程序可以使用新的DDI来报告用于在操作系统和H/W之间传输数据的缓冲区的支持尺寸。这意味着数据传输不必总是使用10ms的缓冲区(就像在以前的操作系统版本中那样)。相反,驱动程序可以指定它是否可以使用小缓冲区,例如 5ms、3ms、1ms 等。b. 需要低延迟的应用程序可以使用新的音频API(AudioGraph或WASAPI),以便查询驱动程序支持的缓冲区大小,并选择将用于与硬件之间的数据传输的缓冲区大小
    3. 当一个应用程序使用低于一定阈值的缓冲区来渲染和捕捉音频时,操作系统会进入一个特殊的模式,它以一种避免音频流和其他子系统之间干扰的方式来管理其资源。这将减少音频子系统执行过程中的中断,并将音频故障的概率降到最低。当应用程序停止流媒体时,操作系统会返回到正常的执行模式。音频子系统由以下资源组成:a.正在处理低延迟音频的音频引擎线程。 b.所有已被驱动注册的线程和中断(使用新的DDI,在关于驱动资源注册的章节中描述)。 c.来自请求小缓冲区的应用程序的部分或全部音频线程,以及来自与任何请求小缓冲区的应用程序共享相同音频设备图(例如,相同信号处理模式)的所有应用程序
    4. 流媒体路径上的AudioGraph回调
    5. 如果应用程序使用WASAPI,那么只有提交给实时工作队列API或MFCreateMFByteStreamOnStreamEx并被标记为 "音频 "或 "ProAudio "的工作项

    一般而言,有两种方法可以降低延迟,第一种就是以独占模式打开端点,没有其他应用程序可以使用该端点来呈现或捕获音频,显然这种方法不太适合;第二种方法是使用 ASIO(音频流输入/输出)模型,该模型利用独占模式。用户安装第三方 ASIO 驱动程序后,应用程序可以直接从应用程序向 ASIO 驱动程序发送数据。但是,应用程序必须以直接与 ASIO 驱动程序对话的方式编写。这种方法要求用户安装第三方驱动,不太适合,所以剩余的方法就是使用更新的 api 来降低往返延迟,如上文所介绍的那样。

    参考:Windows 音频堆栈

    Windows 10 中的所有应用程序都将使用 10 毫秒缓冲区来呈现和捕获音频。如果应用程序需要使用小缓冲区,那么它需要使用新的 AudioGraph 设置或 WASAPI IAudioClient3 接口,以便这样做。但是,如果 Windows 10 中的一个应用程序请求使用小缓冲区,则音频引擎将开始使用该特定缓冲区大小传输音频。在这种情况下,使用相同端点和模式的所有应用程序将自动切换到该小缓冲区大小。当低延迟应用程序退出时,音频引擎将再次切换到 10 毫秒缓冲区。

    类似的案例:如何使用 WASAPI 共享模式使延迟低于 10 毫秒?


    置 HDAudio 驱动程序已更新,以支持 128 个样本 (2.66ms@48kHz) 和 480 个样本 (10ms@48kHz) 之间的缓冲区大小

    128 个样本是指 128  帧,如果我们假设 48 kHz 采样率,则对应于 3 ms,在我们的项目中是使用的 480 帧,对应的 10 ms 缓冲区

  • 相关阅读:
    Visual Studio 出现生成错误 ,要继续并运行上次的成功生成吗?
    postgresql迁mysql之后兼容性问题
    Java中把十进制转为二进制(判断有效的ip地址和掩码)
    Java中如何把整数变为二进制输出
    Java二进制与十进制转换及位运算
    面试知识点总结之开放性问题
    面试知识点总结之常用设计模式
    linux下VIRT,RES,SHR的含义
    JSP JS 日期控件的下载、使用及注意事项
    Html5实现头像上传和编辑,保存为Base64的图片过程
  • 原文地址:https://www.cnblogs.com/strive-sun/p/15076328.html
Copyright © 2020-2023  润新知