适合 Windows、Xbox 和 Hololens 2 应用开发人员的空间音效
注意
本文档面向开发人员受众。 有关在设备上启用空间音效的最终用户支持,请参阅如何在 Windows 10 中打开空间音效。
Microsoft 空间音效是 Microsoft Xbox、Windows 和 HoloLens 2 上的平台级空间音效支持解决方案,同时支持环绕和提升(高于或低于侦听器)音频提示。Windows 桌面 (Win32) 应用以及受支持平台上的通用 Windows 平台 (UWP) 应用可以利用空间音效。 空间音效 API 允许开发人员创建从 3D 空间中的位置发出音频的音频对象。 动态音频对象允许从空间中的任意位置发出音频,这可能会随时间推移而发生变化。 还可以指定音频对象从 17 个预定义静态通道中的一个通道发出声音 (8.1.4.4),这些通道可以表示真实或虚拟扬声器。 用户选择实际输出格式,并可以从 Microsoft 空间音效实现中提取;音频将呈现给现有扬声器、耳机和家庭影院接收器,而无需任何代码或内容更改。 该平台完全支持 HDMI 和立体声耳机输出的实时 Dolby Atmos 编码、用于耳机的 DTS:X 以及立体声耳机的 Windows Sonic for Headphones 编码。 最后,Microsoft 空间音效应用遵守系统混合策略,其音频也将与非空间感知应用混合。 Microsoft 空间音效支持也集成到媒体基础中;使用媒体基础的应用可以成功播放 Dolby Atmos 内容,无需其他实现。
Microsoft 空间音效的空间音效支持电视、家庭影院和支持 Dolby Atmos 的条形音箱。 空间音效还可用于使用者可能拥有的任何耳机对,平台使用 Windows Sonic for Headphones、Dolby Atmos for Headphones 或 DTS Headphone:X 呈现的音频。
启用 Microsoft 空间音效
无论是作为开发人员还是使用者,用户都必须在其设备上启用 Microsoft 空间音效才能听到空间化声音。
Windows
在 Windows 电脑上,这通过给定声音输出设备的属性页来完成。 在“声音”控制面板中,选择输出设备并单击“设备属性”。 在页面的“空间音效”部分中,如果设备支持空间音效,则可以从“空间音效格式”下拉列表中选择一种可用格式。
还可以通过在任务栏中右键单击“音量”图标来启用 Microsoft 空间音效。
Xbox
在 Xbox 上,Microsoft 空间音效功能始终可供使用者使用,并通过>“常规 - 音量和音频输出”下的“设置应用”启用。
HDMI 音频按钮填充了音频视频接收器 (AVR) 或条形音箱或直接连接到 Xbox 主机的电视支持的所有格式。 “光学音频”选项仅在较旧的 Xbox 主机上可用,不适用于 Xbox Series X|S 及更高版本。
请注意,在 HDMI 音频中选择“用于家庭影院的 Dolby Atmos(仅 HDMI)”或“用于家庭影院的 DTS:X(仅 HDMI)”选项将提示用户下载并安装 Dolby Access 或 DTS Sound Unbound 应用(如果尚未安装)
从耳机音频下的耳机格式下拉列表中选择 Dolby Atmos、DTS Headphone:X 或用于耳机的 Windows Sonic
当 Microsoft 空间音效不可用时(例如,在使用嵌入式笔记本电脑立体声扬声器播放时,或者如果用户尚未按照上述说明显式启用 Microsoft 空间音效),ISpatialAudioClient::GetMaxDynamicObjectCount 返回给应用程序的可用动态对象数将为 0。
HoloLens 2
在 HoloLens 2 上,默认启用 Microsoft 空间音效,并使用专为用于耳机的 Windows Sonic设计的硬件 DSP 卸载。
Microsoft 空间音效和音频中间件
许多应用和游戏开发人员使用第三方音频呈现引擎解决方案,这些解决方案通常包括复杂的创作和审核工具。 Microsoft 与其中几个解决方案提供商合作,在其现有创作环境中实现 Microsoft 空间音效。 这通常意味着此处讨论的 API 从应用视图中提取;它们包装为应用可以实例化的数字信号处理 (DSP) 插件,应用的音频实现者可以使用该插件混合到 Microsoft 空间音效声床、子混合或根据需要将单个语音发送到动态对象实例插件。 请咨询音频中间件解决方案提供商,了解他们为 Microsoft 空间音效提供的支持程度。
适用于音频呈现器的 Microsoft 空间音效
许多音频呈现器都面向 Windows 音频会话 API (WASAPI) IAudioClient 终结点,其中应用程序将混合和格式一致的音频数据的缓冲区馈送到 WASAPI 音频接收器;然后,提供的缓冲区用于与其他客户端混合、进行最终的系统级处理和呈现。
Microsoft 空间音效空间终结点作为 ISpatialAudioClient 实现,该函数与 IAudioClient 有许多相似之处。 它支持形成声床的静态声音对象,支持高达 8.1.4.4 通道(侦听器周围 8 个通道 – 左、右、中、左侧、右侧、左后、右后和后中;1 个低频率效果通道;侦听器上方 4 个通道;侦听器下方 4 个通道)。 它还支持动态声音对象,这些对象可以随意位于 3D 空间中。
ISpatialAudioClient 的一般实现编码模式为:
- 创建静态和/或动态音频对象。
- 为每个对象的音频缓冲区提供每个帧,以供系统呈现。
- 按需更新动态对象的 3D 位置 - 按照应用所需经常(或不经常)。
请注意,当前输出格式(扬声器或耳机;用于耳机的 Windows Sonic、Dolby Atmos 或 DTS Headphone:X)从上述实现中提取 – 应用开发人员可以专注于空间音效,而无需根据格式来回调整。 希望可根据输出格式进行修改的应用可以查询正在使用的格式,但抽象意味着应用不需要处理这些格式。
Microsoft 空间音效与音频呈现器集成
由于 ISpatialAudioClient 是一个使用数据的音频接收器,因此音频呈现器有多种选项可用于与音频数据交互并将其传送到其中。 有三种常用的集成技术(对于使用音频中间件的游戏,可能会看到基于这些选项提供的等效插件):
- 7.1.4 平移器和主语音:已支持 7.1 终结点的呈现器可以选择仅添加对 ISpatialAudioClient 静态声床支持的四个额外高度通道的支持。 可以更新以前执行的任何通道平移(可能已经利用 x,y, z 坐标),以包括这些高度通道。 这通常为呈现器和应用音频工作流、信号、流和混合控件提供最少的中断。 在耳机上,请注意,完整的应用混合将空间化 ,因此即使是立体声音乐也可能被视为侦听器的“外部化”。
- 维护现有终结点,并添加一个 7.1.4 总线(和平移器):一些游戏可以选择维护两个终结点:其现有的立体声 WASAPI 终结点(对于“直接入耳”内容,而不是空间化内容)以及支持 7.1.4(甚至高达 8.1.4.4)的 ISpatialAudioClient 静态声床。 当然,尽管保持同步,但管理两种混合之间的交互会给内容创建者带来额外的挑战,因为给定时间处于活动状态的 WASAPI 和 ISAC 实例确实使用相同的缓冲区大小和时钟进行处理。
- 对某些语音或子混合使用动态声音对象:提供可能最详细/准确的定位,但可能会产生混合不透明度,此方法涉及使用 ISpatialAudioClient 动态声音对象。 请注意,元数据和音频缓冲区将传送到呈现器,因此这些声音将不透明地传送到应用混合的其余部分。 此外,由于可用的动态声音对象数量有限,因此呈现器需要考虑实现优先顺序技术 - 剔除、声音共置、混合到静态声床等。 游戏经常将这种技术用于各种“主”声音,例如将在侦听器上方盘旋的直升机。
呈现器还可以在这些方法之间混合和匹配。
Microsoft 空间音效运行时资源影响
在 Windows 和 Xbox 上,可用语音的数量因所使用的格式而异。 Dolby Atmos 格式支持总共 32 个活动对象(因此,如果正在使用 7.1.4 声床,则可以激活 20 个额外的动态声音对象)。 用于耳机的 Windows Sonic 支持 128 个活动对象总数,低频率效果 (LFE) 通道实际上未计为对象 -- 因此,当 8.1.4.4 声床正在使用时,112 个动态声音对象可以处于活动状态。
对于在 Xbox One 游戏主机上运行的通用 Windows 平台应用,实时编码(适用于家庭剧院的 Dolby Atmos、用于耳机的 Dolby Atmos、适用于家庭剧院的 DTS:X、DTS Headphone:X 和用于耳机的 Windows Sonic)在硬件中执行,无需 CPU 费用。
从 2303 Xbox OS 更新和游戏开发工具包 (GDK) 开始,Xbox 上的资源限制将更新为以下值:
Format | 最大静态对象(声床) | 最大动态对象 Xbox Series X|S、UWP 应用和 >=2303 GDK |
最大动态对象 Xbox Series X|S、XDK 和 <2303 GDK |
最大动态对象 Xbox One |
---|---|---|---|---|
适用于家庭剧院的 Dolby Atmos (HDMI) | 12 (7.1.4) | 20 | 20 | 20 |
适用于家庭剧院的 DTS:X (HDMI) | 17 (8.1.4.4) | 20 | 20 | 16 |
Dolby Atmos(耳机) | 17 (8.1.4.4) | 128 | 20 | 16 |
DTS Headphone:X(耳机) | 17 (8.1.4.4) | 200 | 20 | 16 |
Windows Sonic(耳机) | 17 (8.1.4.4) | 220 | 20 | 15 |
从 Windows 内部版本 22621 5 月维护版本开始,Windows 上的资源限制将更新为以下值:
Format | 最大静态对象(声床) | 最大动态对象 Windows |
最大动态对象 HoloLens 2 |
---|---|---|---|
Dolby Atmos 家庭剧院 (HDMI) | 12 (7.1.4) | 20 | 空值 |
适用于家庭剧院的 DTS:X (HDMI) | 17 (8.1.4.4) | 32 | 空值 |
Dolby Atmos(耳机) | 17 (8.1.4.4) | 128 | 空值 |
Dolby Atmos(内置扬声器) | 17 (8.1.4.4) | 128 | 空值 |
DTS Headphone:X(耳机) | 17 (8.1.4.4) | 128 | 空值 |
DTS:X Ultra(内置扬声器) | 17 (8.1.4.4) | 128 | 空值 |
Windows Sonic(耳机) | 17 (8.1.4.4) | 128 | 31 |
对于以前的 Windows、Xbox 和 HoloLens 版本,以下资源限制适用。
Format | 最大静态对象(声床) | 最大动态对象 Xbox One |
最大动态对象 Windows |
最大动态对象 HoloLens 2 |
---|---|---|---|---|
适用于家庭剧院的 Dolby Atmos (HDMI) | 12 (7.1.4) | 20 | 20 | 空值 |
适用于家庭剧院的 DTS:X (HDMI) | 17 (8.1.4.4) | 16 | 32 | 空值 |
Dolby Atmos(耳机) | 17 (8.1.4.4) | 16 | 16 | 空值 |
Dolby Atmos(内置扬声器) | 17 (8.1.4.4) | 空值 | 16 | 空值 |
DTS Headphone:X(耳机) | 17 (8.1.4.4) | 16 | 32 | 空值 |
DTS Ultra(内置扬声器) | 17 (8.1.4.4) | 空值 | 32 | 空值 |
用于耳机的 Windows Sonic | 17 (8.1.4.4) | 15 | 112 | 31 |
应用还应考虑以下资源影响:
- 存储/光盘带宽:预先创作到 7.1.4 的线性内容通常大于 7.1 线性内容(尽管感知编解码器已经常利用通道关联,使这一内容远远少于实际音频数据通道的 50% 以上)
- 其他数字信号处理成本:一些以前的全局影响现在可能会根据动态声音对象实例化。 此外,某些内容创建者可能希望更新一些 DSP 效果以支持其他通道,或以独有的方式使用它们。
Microsoft 空间音效和声音空间化提示
Microsoft 空间音效侧重于在侦听器周围的理想范围进行声音定位模拟。 用于耳机的 Windows Sonic、DTS Headphone:X 和 Dolby Atmos 实现扬声器到耳机的映射和虚拟化,但请注意,声音空间模拟的许多其他方面(通常已以内容创建者支持的方式实现)留给现有引擎来解决。 内容创建者继续使用他们以前为 Doppler、基于距离的衰减和筛选、遮挡和障碍以及环境混响等空间提示提供的现有游戏工具和流程。
其他资源
- Microsoft 空间音效示例 GitHub 存储库
- Dolby 在 https://developer.dolby.com 提供许多与 Dolby Atmos 和 Dolby Access 应用相关的支持资源。
空间音效接口
接口 | 说明 |
---|---|
ISpatialAudioClient | 使客户端能够创建从 3D 空间中的位置发出音频的音频流。 |
ISpatialAudioObject | 表示一个对象,该对象提供从 3D 空间中相对于用户的位置呈现的音频数据。 |
ISpatialAudioObjectRenderStream | 提供用于控制空间音频对象呈现流的方法,包括启动、停止和重置流。 |
ISpatialAudioObjectRenderStreamNotify | 为空间音频客户端提供响应 ISpatialAudioObjectRenderStream 状态更改的通知。 |
注意
使用 Xbox One 开发工具包 (XDK) 游戏的 ISpatialAudioClient 接口时,必须先调用 EnableSpatialAudio,然后再调用 IMMDeviceEnumerator::EnumAudioEndpoints 或 IMMDeviceEnumerator::GetDefaultAudioEndpoint。 否则将导致 Activate 调用返回 E_NOINTERFACE 错误。 EnableSpatialAudio 仅适用于 XDK 游戏,无需为在 Xbox One 上运行的通用 Windows 平台应用或任何非 Xbox One 设备调用。
空间音效结构
结构 | 说明 |
---|---|
SpatialAudioObjectRenderStreamActivationParams | 表示空间音频呈现流的激活参数。 |
SpatialAudioClientActivationParams | 表示空间音频呈现流的可选激活参数。 |
空间音效枚举
枚举 | 说明 |
---|---|
AudioObjectType | 指定 ISpatialAudioObject 的类型。 |