Windows 10低延迟音频技术详解
Windows 10低延迟音频技术详解
低延迟音频技术在专业音频、音乐创作、通信、虚拟现实和游戏等领域具有重要意义。本文详细介绍了Windows 10中低延迟音频的实现方式,包括音频堆栈改进、API增强以及驱动程序支持等方面的技术细节。
低延迟音频的重要性
音频延迟是指从创建声音到听到声音之间的时间差。对于以下关键应用场景,低音频延迟尤为重要:
- 专业音频
- 音乐创作
- 通信
- 虚拟现实
- 游戏
Windows 10在音频延迟方面进行了重大改进,主要体现在三个方面:
- 所有使用音频的应用程序的往返延迟减少4.5-16毫秒
- 使用浮点数据的应用程序延迟降低16毫秒
- 使用整数数据的应用程序延迟降低4.5毫秒
Windows音频堆栈详解
下图展示了Windows音频堆栈的简化版本:
呈现路径延迟
- 应用程序将数据写入缓冲区
- 音频引擎读取数据并处理,加载音频处理对象(APO)
- APO的延迟因信号处理而异
- 在Windows 10之前,浮点数据延迟约12毫秒,整数数据延迟约6毫秒
- Windows 10及更高版本将延迟降低至1.3毫秒
- 音频引擎将处理后的数据写入缓冲区
- 缓冲区大小由音频驱动程序定义
- 驱动程序从缓冲区读取数据并发送到硬件
- 硬件可能再次处理数据
- 用户通过扬声器听到音频
捕获路径延迟
- 音频从麦克风捕获
- 硬件处理数据
- 驱动程序将数据写入缓冲区
- 缓冲区大小由音频驱动程序定义
- 音频引擎读取数据并处理,加载APO
- APO的延迟因信号处理而异
- 在Windows 10之前,浮点数据延迟约6毫秒,整数数据延迟约0毫秒
- Windows 10及更高版本将延迟降低至约0毫秒
- 应用程序读取处理后的数据
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为驱动程序提供了以下功能:
- 声明最小缓冲区大小
- 改进驱动程序和OS之间的协调
- 注册驱动程序资源
声明最小缓冲区大小
驱动程序可以使用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管理资源,避免音频流式处理和其他子系统之间的干扰。
度量工具
为了测量往返延迟,可以使用通过扬声器播放脉冲并通过麦克风捕获的工具。测量路径包括:
- 应用程序调用呈现API播放脉冲
- 音频通过扬声器播放
- 音频从麦克风捕获
- 捕获API检测到脉冲
常见问题
所有应用程序都使用新API进行低延迟是否更好?
不一定。低延迟意味着更高的能耗,且某些应用程序更注重音频质量而非延迟。
所有Windows 10系统是否都支持小型缓冲区?
不是。需要更新驱动程序,且OEM决定更新哪些系统。
所有应用程序是否都会自动使用小型缓冲区?
不是。默认使用10毫秒缓冲区,需要应用程序显式请求小缓冲区。
本文原文来自微软官方文档