问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Windows 10低延迟音频技术详解

创作时间:
作者:
@小白创作中心

Windows 10低延迟音频技术详解

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/audio/low-latency-audio

低延迟音频技术在专业音频、音乐创作、通信、虚拟现实和游戏等领域具有重要意义。本文详细介绍了Windows 10中低延迟音频的实现方式,包括音频堆栈改进、API增强以及驱动程序支持等方面的技术细节。

低延迟音频的重要性

音频延迟是指从创建声音到听到声音之间的时间差。对于以下关键应用场景,低音频延迟尤为重要:

  • 专业音频
  • 音乐创作
  • 通信
  • 虚拟现实
  • 游戏

Windows 10在音频延迟方面进行了重大改进,主要体现在三个方面:

  1. 所有使用音频的应用程序的往返延迟减少4.5-16毫秒
  2. 使用浮点数据的应用程序延迟降低16毫秒
  3. 使用整数数据的应用程序延迟降低4.5毫秒

Windows音频堆栈详解

下图展示了Windows音频堆栈的简化版本:

呈现路径延迟

  1. 应用程序将数据写入缓冲区
  2. 音频引擎读取数据并处理,加载音频处理对象(APO)
  3. APO的延迟因信号处理而异
  4. 在Windows 10之前,浮点数据延迟约12毫秒,整数数据延迟约6毫秒
  5. Windows 10及更高版本将延迟降低至1.3毫秒
  6. 音频引擎将处理后的数据写入缓冲区
  7. 缓冲区大小由音频驱动程序定义
  8. 驱动程序从缓冲区读取数据并发送到硬件
  9. 硬件可能再次处理数据
  10. 用户通过扬声器听到音频

捕获路径延迟

  1. 音频从麦克风捕获
  2. 硬件处理数据
  3. 驱动程序将数据写入缓冲区
  4. 缓冲区大小由音频驱动程序定义
  5. 音频引擎读取数据并处理,加载APO
  6. APO的延迟因信号处理而异
  7. 在Windows 10之前,浮点数据延迟约6毫秒,整数数据延迟约0毫秒
  8. Windows 10及更高版本将延迟降低至约0毫秒
  9. 应用程序读取处理后的数据

API改进

Windows 10提供了两个支持低延迟的API:AudioGraph和WASAPI。

AudioGraph

AudioGraph是Windows 10及更高版本中的通用Windows平台API,支持C++、C#和JavaScript等多种编程语言。它通过AudioGraphSettings::QuantumSizeSelectionMode属性提供低延迟功能,可选择系统默认缓冲区大小或驱动程序支持的最小值。

WASAPI

WASAPI在Windows 10中新增了以下功能:

  • 允许应用程序发现设备支持的缓冲区大小范围
  • 允许应用程序发现音频引擎的当前格式和周期性
  • 允许应用程序指定呈现/捕获格式

这些功能由IAudioClient3接口提供,支持所有Windows设备。但是,具有足够资源和更新驱动程序的设备才能提供更好的用户体验。

驱动程序改进

为了支持低延迟音频,Windows 10为驱动程序提供了以下功能:

  1. 声明最小缓冲区大小
  2. 改进驱动程序和OS之间的协调
  3. 注册驱动程序资源

声明最小缓冲区大小

驱动程序可以使用DEVPKEY_KsAudio_PacketSize_Constraints2设备属性来表达其缓冲区大小功能。例如,以下代码片段演示驱动程序如何声明绝对支持的缓冲区大小为2毫秒:

static struct
{
    KSAUDIO_PACKETSIZE_CONSTRAINTS2 TransportPacketConstraints;
    KSAUDIO_PACKETSIZE_PROCESSINGMODE_CONSTRAINT AdditionalProcessingConstraints[1];
} SysvadWaveRtPacketSizeConstraintsRender =
{
    {
        2 * HNSTIME_PER_MILLISECOND,                // 2 ms minimum processing interval
        FILE_BYTE_ALIGNMENT,                        // 1 byte packet size alignment
        0,                                          // no maximum packet size constraint
        2,                                          // 2 processing constraints follow
        {
            STATIC_AUDIO_SIGNALPROCESSINGMODE_DEFAULT,          // constraint for default processing mode
            128,                                                // 128 samples per processing frame
            0,                                                  // NA hns per processing frame
        },
    },
    {
        {
            STATIC_AUDIO_SIGNALPROCESSINGMODE_MOVIE,            // constraint for movie processing mode
            1024,                                               // 1024 samples per processing frame
            0,                                                  // NA hns per processing frame
        },
    }
};

改进驱动程序和OS之间的协调

这些DDI允许驱动程序:

  • 明确指示缓冲区中可供Windows使用的一半
  • 优化或简化数据传输
  • 提供准确的时间戳信息

注册驱动程序资源

音频驱动程序必须在Portcls中注册其流式处理资源,包括中断和驱动程序拥有的线程。这允许Windows管理资源,避免音频流式处理和其他子系统之间的干扰。

度量工具

为了测量往返延迟,可以使用通过扬声器播放脉冲并通过麦克风捕获的工具。测量路径包括:

  1. 应用程序调用呈现API播放脉冲
  2. 音频通过扬声器播放
  3. 音频从麦克风捕获
  4. 捕获API检测到脉冲

常见问题

  1. 所有应用程序都使用新API进行低延迟是否更好?

    不一定。低延迟意味着更高的能耗,且某些应用程序更注重音频质量而非延迟。

  2. 所有Windows 10系统是否都支持小型缓冲区?

    不是。需要更新驱动程序,且OEM决定更新哪些系统。

  3. 所有应用程序是否都会自动使用小型缓冲区?

    不是。默认使用10毫秒缓冲区,需要应用程序显式请求小缓冲区。

本文原文来自微软官方文档

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号