面向开发人员的混合现实捕获 (DirectX)

注意

请参阅下面的从 PV 相机渲染,获取有关 HoloLens 2 新 MRC 功能的指导。

在开始之前,建议阅读混合现实捕获概述一文。

从 PV 相机渲染(选择启用)

HoloLens 2 针对沉浸式应用添加了当混合现实捕获正在运行时,从 PV 相机渲染的功能。 若要确保应用正确支持附加渲染,必须选择启用此功能。

与默认 MRC 体验相比,从 PV 相机渲染提供了以下改进:

  • 在近距交互时,全息影像与物理环境和手部的对齐状态在所有距离处都应准确。 避免像在默认 MRC 中那样,在除焦点外的距离发生偏移。
  • 头戴显示设备中的右眼不会受到影响,因为它不会用于渲染 MRC 输出的全息影像。

执行三个步骤启用从 PV 相机渲染:

  1. 启用 PhotoVideoCamera HolographicViewConfiguration
  2. 处理附加 HolographicCamera 渲染
  3. 验证着色器以及代码是否从其他 HolographicCamera 正确渲染
在 DirectX 中启用 PhotoVideoCamera HolographicViewConfiguration

若要选择加入从 PV 相机呈现,应用只需启用 PhotoVideoCamera 的 HolographicViewConfiguration

var display = Windows.Graphics.Holographic.HolographicDisplay.GetDefault();
var view = display.TryGetViewConfiguration(Windows.Graphics.Holographic.HolographicViewConfigurationKind.PhotoVideoCamera);
if (view != null)
{
    view.IsEnabled = true;
}
在 DirectX 中处理其他 HolographicCamera 呈现

当应用选择加入从 PV 相机呈现时,混合现实捕获开始:

  1. 将引发 HolographicSpace CameraAdded 事件。 如果应用目前无法处理相机,此事件会发生延迟。
  2. 事件完成且无明显延迟后,HolographicCamera 将显示在下一个 HolographicFrame 的 AddedCameras 列表中。

当混合现实捕获停止(或者应用在混合现实捕获运行时禁用视图配置)时:HolographicCamera 将显示在下一个 HolographicFrame 的 RemovedCameras 列表中,并且将引发 HolographicSpace CameraRemoved 事件。

已将 ViewConfiguration 属性添加到 HolographicCamera,以帮助确定相机所属的配置。

验证着色器与代码是否支持其他相机

运行混合现实捕获并检查对齐异常、内容缺失或性能问题。 根据情况更新着色器和代码。

如果某些场景不支持在其他相机呈现,可以禁用 PhotoVideoCamera HolographicViewConfiguration。

在应用中禁用 MRC

2D 应用

2D 应用可以通过以下方式选择在混合现实捕获运行时遮挡其视觉内容:

沉浸式应用

沉浸式应用可以通过以下方式选择从混合现实捕获中排除其视觉内容:

密码键盘

在 Windows 10 2019 年 5 月更新中,当显示密码键盘或固定键盘时,会自动从混合现实捕获中排除视觉内容。

了解 MRC 何时处于活动状态

应用可以使用 AppCapture 类来了解何时运行系统混合现实捕获(针对音频或视频)。

注意

如果设备上没有混合现实捕获,AppCapture 的 GetForCurrentView API 可能会返回 Null。 此外,在应用挂起时务必取消注册 CapturingChanged 事件,否则 MRC 可能会进入已阻止状态。

从应用内部集成 MRC 功能

混合现实应用可以从应用内部启动 MRC 照片或视频捕获,捕获的内容可供应用使用,而无需存储到设备的“相机交卷”中。你可以创建自定义 MRC 录制器,或利用内置的相机捕获 UI。

具有内置相机 UI 的 MRC

开发人员可以使用相机捕获 UI API 获取用户捕获的混合现实照片或视频,只需几行代码即可

此 API 启动内置的 MRC 相机 UI(用户可以在其中拍摄照片或视频),并将生成的捕获返回到应用。 如果你需要添加自己的相机 UI 或用于捕获流的较低级别访问权限,可以创建自定义混合现实捕获录制器。

带有屏幕捕获的 MRC

借助 HoloLens 2 2021 年 5 月更新(Windows Holographic 版本 21H1 内部版本 20346.1002),开发人员可以使用屏幕捕获 API 请求混合现实视频帧流。

创建自定义 MRC 录制器

虽然用户始终可以使用系统 MRC 捕获服务触发照片或视频捕获,但应用程序可能需要构建自定义相机应用,该应用与 MRC 类似,在相机流中包括全息影像。 这样,应用程序可以启动用户输入的捕获、生成自定义录制 UI 或自定义 MRC 设置,仅举几例。

HoloStudio 使用 MRC 效果添加自定义 MRC 相机

HoloStudio 使用 MRC 效果添加自定义 MRC 相机

其他应用程序可以通过使用 Windows 媒体捕获 API 来控制相机,并添加 MRC 视频和音频效果,以在静止和视频中包括虚拟全息影像和应用程序音频。

应用程序有两种方式来添加效果:

注意

Visual Studio 无法识别 Windows.Media.MixedRealityCapture 命名空间,但该字符串仍然有效。

MRC 视频效果 (Windows.Media.MixedRealityCapture.MixedRealityCaptureVideoEffect)

属性名称 类型 默认值 说明
StreamType UINT32 (MediaStreamType) 1 (VideoRecord) 描述可使用此效果的捕获流。 音频不可用。
HologramCompositionEnabled boolean TRUE 用于在视频捕获中启用或禁用全息影像的标志。
RecordingIndicatorEnabled boolean TRUE 用于在捕获全息影像时启用或禁用屏幕上的录制指示器的标志。
VideoStabilizationEnabled boolean FALSE 用于启用或禁用由 HoloLens 跟踪器提供支持的视频防抖动。
VideoStabilizationBufferLength UINT32 0 设置用于视频防抖动的历史帧数。 0 是 0 延迟,几乎“不受”电源和性能的影响。 建议设置为 15,以获得最高质量(代价是 15 帧延迟和内存)。
GlobalOpacityCoefficient FLOAT 0.9 (HoloLens) 1.0(沉浸式头戴显示设备) 将全息影像的全局不透明度系数设置为 0.0(完全透明)到 1.0(完全不透明)。
BlankOnProtectedContent boolean FALSE 用于启用或禁用在 2D UWP 应用显示受保护内容时返回空帧。 如果此标志为 False,且 2D UWP 应用正在显示受保护的内容,则在头戴显示设备和混合现实捕获中,2D UWP 应用均将替换为受保护内容纹理。
ShowHiddenMesh boolean FALSE 用于启用或禁用显示全息相机隐藏区域网格和相邻内容的标志。
OutputSize 大小 0, 0 设置裁剪后所需的输出大小,以实现视频稳定性。 如果指定了 0 或无效的输出大小,则选择默认裁剪大小。
OutputSubtype 字符串 Nv12 在全息影像合成和/或视频防抖动后设置所需的输出子类型。 支持 Nv12Argb32 MediaEncodingSubtypes
PreferredHologramPerspective UINT32 Windows 设备门户中的“从相机呈现”设置 用于指示应捕获的全息相机视图配置的枚举:0 (Display) 表示不会要求应用从照片/视频相机呈现,1 (PhotoVideoCamera) 则要求应用从照片/视频相机呈现(如果应用支持)。 仅支持 HoloLens 2

注意

可以通过在 Windows 设备门户中转到“混合现实捕获”页并取消选中“从相机呈现”,更改“PreferredHologramPerspective”的默认值。 此设置默认为“1 (PhotoVideoCamera)”,但可以取消选中以设置为“0 (Display)”

在 2020 年 6 月更新(Windows 全息版 2004,内部版本 19041.1106 和 Windows 全息版 1903,内部版本 18362.1064)之前,PreferredHologramPerspective 的默认值为“0 (Display)”

在 2021 年 5 月更新(Windows Holographic 版本 21H1 内部版本 20346.1002)中添加了对 OutputSubtype 的支持。

MRC 音频效果 (Windows.Media.MixedRealityCapture.MixedRealityCaptureAudioEffect)

属性名称 类型 默认值 说明
MixerMode UINT32 2 (麦克风和系统音频) 用于指示应使用的音频源的枚举:0 (仅麦克风音频)、1 (仅系统音频)、2 (麦克风和系统音频)
LoopbackGain FLOAT Windows 设备门户中的“应用音频增益”设置 应用于系统音频音量的增益。 范围为 0.0 到 5.0。 仅支持 HoloLens 2
MicrophoneGain FLOAT Windows 设备门户中的“麦克风音频增益”设置 应用于麦克风音量的增益。 范围为 0.0 到 5.0。 仅支持 HoloLens 2

注意

可以通过在 Windows 设备门户中转到“混合现实捕获”页,并调整“LoopbackGain”或“MicrophoneGain”设置旁的滑块,来更改各自的默认值。 这两个设置默认为“1.0”,但可设置为介于“0.0”和“5.0”之间的任何值

2020 年 6 月更新(Windows 全息版 2004,内部版本 19041.1106 和 Windows 全息版 1903,内部版本 18362.1064)中增加了通过 Windows 设备门户配置默认增益值的功能。

同时 MRC 限制

当多个应用同时访问 MRC 时,需要注意某些限制。

照片/视频相机访问

在 HoloLens 1 上,当进程录制视频或拍摄照片时,MRC 将无法捕获照片或视频。 反之亦然:如果 MRC 正在运行,应用程序将无法访问相机。

使用 HoloLens 2,可以共享对相机的访问权限。 如果不需要直接控制分辨率或帧速率,可以将 SharedMode 属性与 SharedReadOnly 结合用于初始化 MediaCapture。

内置 MRC 照片和视频相机访问

Windows 10 中内置的 MRC 功能(通过 Cortana、“开始”菜单、硬件快捷方式、Miracast、Windows 设备门户访问):

  • 默认使用 ExclusiveControl 运行

但是,MRC 子系统中增加了在共享模式下运行的支持:

  • 如果应用请求对照片/视频相机进行 ExclusiveControl 访问,则内置 MRC 将自动停止使用照片/视频相机,以便应用请求获得成功
  • 如果内置 MRC 在应用具有 ExclusiveControl 时启动,则内置 MRC 将在 SharedReadOnly 模式下运行

此共享模式功能存在一些限制:

  • 通过 Cortana、硬件快捷方式或“开始”菜单访问照片:需要 Windows 10 2018 年 4 月更新(或更高版本)
  • 通过 Cortana、硬件快捷方式或“开始”菜单访问视频:需要 Windows 10 2018 年 4 月更新(或更高版本)
  • 通过 Miracast 流式传输 MRC:需要 Windows 10 2018 年 10 月更新(或更高版本)
  • 通过 Windows 设备门户或 HoloLens 伴侣应用流式传输 MRC:需要 HoloLens 2

注意

当其他应用正在使用照片/视频相机时,内置 MRC 相机 UI 的分辨率和帧速率可能会下降而低于正常值。

开发人员的 MRC 访问权限

建议在使用 MRC 时始终请求相机的独占控制。 这可确保应用程序可以完全控制相机的设置,但前提是你了解上述限制。

注意

在继续操作之前,请务必仔细阅读 SharingMode 备注

  • 按所需方式设置相机
  • 启动应用,使用启动 API 捕获视频帧,然后启用 MRC

注意

如果在启动应用之前启动 MRC,则无法保证该功能如期工作。

可以在全息人脸跟踪示例中查找上述过程的完整示例。

注意

在 Windows 10 2018 年 4 月更新之前,应用的自定义 MRC 录制器与系统 MRC(从 Windows 设备门户捕获照片、捕获视频或流式传输)互斥。

另请参阅