识别内部相机的位置(UWP 设备应用)

本主题提供有关在 Windows 8.1 中的系统上支持内部相机的信息。 它介绍如何识别内置相机的物理位置,以便它们能够正确使用 UWP 应用。 它还介绍如何设置模型 ID,以便相机使用 UWP 设备应用。 要了解有关 UWP 设备应用的一般详细信息,请参阅初识 UWP 设备应用

提供物理位置

具有机械固定方向的内置相机的系统必须报告相机的物理位置。 此物理位置信息指示相机的朝向(例如前置或后置),以便应用在 Windows 8.1 中正确使用相机。

需要满足以下两项 Windows 硬件认证要求,以便 Windows 识别相机的位置:

  • System.Client.PCContainer.PCAppearsAsSingleObject。 相机必须分组到计算机的设备容器中,该容器包含计算机内部的物理设备功能。 必须将相机分组到计算机的设备容器中,以便将其物理位置公开给应用,因为计算机容器外部的设备不会假定具有机械固定方向。

  • System.Client.Webcam.PhysicalLocation。 固件必须使用 ACPI 表中的 _PLD 信息来指示相机的位置和方向,从而提供物理位置信息。

为什么 Windows 需要物理位置相机

Windows 需要知道内部相机的物理位置,原因如下:

  • 存在多个相机时,UWP 应用使用物理位置来确定要使用的相机。 例如,聊天应用程序启动时会默认使用面向用户的前置摄像头。

  • UWP 应用使用物理位置来确定如何镜像或旋转视频预览。

  • 如果相机正对着用户,预览效果就会像用户正对着一面镜子。 为此,应用将翻转预览的左侧和右侧,以便预览镜像视频。 如果相机背对用户的方向,则应用无需镜像视频。

  • 如果应用旋转预览,则旋转程度因相机位置而异。

如何将相机分组到计算机设备容器中

根据认证要求 System.Client.PCContainer.PCAppearsAsSingleObject(也称为 SYSFUND-0200),内部相机设备节点必须分组到电脑设备容器下。 换句话说,内部相机不应显示在“设备和打印机”中,并且必须合并到电脑容器中。

实现此要求的方式取决于内部相机的总线类型。 如果设备可以在 ACPI 表中的物理设备位置公开信息,则可以在 ACPI 层中指定正确的分组,方法是在表中包括 _PLD 信息并修改 ACPI 表中的 UserVisible 标志,如多功能设备支持和设备容器分组中所述。 否则,请使用 DeviceOverrides 注册表项替代可移动标志。 有关详细信息,请参阅 DeviceOverrides 注册表项

如何使用 ACPI 表中的 _PLD 信息提供物理位置

根据认证要求 System.Client.Camera.PhysicalLocation,指示相机位置的 _PLD 值必须在 ACPI(高级配置和电源接口)表中提供。 这适用于内置到系统机箱并具有机械固定方向的任何相机设备。 固件必须提供 _PLD 方法,并将面板字段(位 69:67)设置为安装相机的面板的适当值。 例如,“前置”表示相机面向用户(网络摄像头),而“后置”表示相机背向最终用户的方向(静态相机或视频相机)。

位 69:67 的值 Panel
0 上限
1
2 Left
3 Right
4 Front
5 返回
6 未知

此外,位 143:128(垂直偏移量)和位 159:144(水平偏移量)必须提供相机相对于显示器的相对位置。 此原点相对于显示组件中的本机像素寻址,应与当前横向或纵向的显示方向相匹配。 原点是显示器的左下角,其中水平偏移值和垂直偏移的正值分别位于右侧和上侧。

对于 USB 连接的内部相机,将在 USB 端口设备节点下的 ACPI 表中创建 USB 设备的设备节点。

要指定地址 (_ADR):

  1. 将 Windows 安装到目标电脑

  2. 转到“设备管理器”

  3. 选择并按住(或右键单击)你的目标网络摄像头,然后选择“属性”。

  4. 打开“详细信息”选项卡,然后在“属性”菜单中选择“地址”

  5. “值”框中的值是设备所在的地址

  6. 设置 ACPI 表中 _ADR 的值

  7. 根据 ACPI 规格和电脑设计设置 _PLD 值

此示例是 USB 连接的相机的 ACPI 表。 在此示例中,该值为 0x1。 第九个字节包含位置 (bits[69:67]) 的面板代码。 请注意,如果设备是 USB 复合设备,PLD 必须位于视频功能上。 这意味着需要其他 Device() 条目。

Device(PRTD)
{
     Name(_ADR, 0x6)
     Name(_UPC, Package(0x4)
     {
            ....
     }
     Name(_PLD, Buffer(0x10)
     {
            ....
     }
     Device(WCAM)
     {
           Name(_ADR, 0x6)
           Name(_PLD, Buffer(0x10) {
           0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
           0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
     }
}

有关 _PLD 的更多详细信息,请参阅 ACPI 规范。

对于 USBCCGP 下游的节点,地址值的计算方法是将端口号与相机功能的第一个接口号相加。 如果没有为设备加载 USBCCGP,则地址只是端口号。 如果需要在不安装 Windows 的情况下预测地址号,请使用此公式计算它。 如果目标设备是单功能设备(不使用 USB 复合样式设备),则仅使用端口号计算地址值。

提供模型 ID

仅当相机的设备节点具有模型 ID 属性且设备类别为 Imaging.Webcam 时,Windows 设备元数据系统才能查询内部嵌入相机的设备元数据包。 要使内部相机的元数据可由 Windows 发现,以便设备元数据包与设备和特定于相机的 UWP 设备应用正确关联,OEM 需要执行以下操作:

  • 使用设备注册表项中的 InternalDeviceModification 标志在设备节点中设置模型 ID

如何设置内部相机设备节点的模型 ID

对于内部相机,OEM 将创建用于模型 ID 的 GUID,并为其创建注册表项。 模型 ID 属性通过使用 InternalDeviceModification 机制添加到设备节点,该机制是基于注册表的查阅表 (LUT),其中包含映射到特定设备的注册表项。 此 InternalDeviceModification 表在以下注册表项下维护:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\InternalDeviceModification

在 InternalDeviceModification 注册表项下创建的子项是 OEM 提供的 ModelID GUID。 此项的存在会基于设备硬件 ID 和 ACPI 表中 _PLD 值指示的位置信息,将模型 ID 添加到相机的设备节点。

registry keys and values for internaldevicemodification.

InternalDeviceModification 注册表项

InternalDeviceModification 注册表项表明至少有一个相机使用 ModelID。

注册表项名称 InternalDeviceModification
必需/可选 必须
路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
格式要求
有效的子项 模型 ID 注册表项(请参阅以下子项格式要求和示例)

模型 ID 注册表项

注册表项名称 模型 ID(具体的模型 ID 值是项名称)
必需/可选 必须
格式要求 项名称是由 OEM 创建的 GUID。 它必须同时具有左括号和右括号。
有效值 硬件 ID 注册表值或 PLD_Panel
示例 {43922620-DAD9-4C05-BE3F-F65B089D84D8}

硬件 ID 注册表值

注册表值名称 HardwareIDs
必需/可选 必须
类型 多字符串
格式要求 必须包含硬件 ID 的总线前缀。 所有 "" 字符都必须替换为“#”。
示例 USB#VID_1234&PID_ABCD&REV_0001, PCI#VEN_ABCD&DEV_1234&SUBSYS_000
注释 可以提供多个硬件 ID 值。 当列表中出现多次任何硬件 ID 时,系统会根据硬件 ID 设置设备节点的模型 ID。

PLD_Panel 注册表值

注册表值名称 PLD_Panel
必需/可选 可选
类型 DWORD
格式要求 必须包含硬件 ID 的总线前缀。 所有“\”字符都必须替换为“#”。
示例 4,5

PLD_Panel 详细信息

ACPI 表中提供的 PLD_Panel 值使相机能够在系统具有两个相同的相机设备且都具有相同的硬件 ID 时将其相互区分。 要创建不同的模型 ID,请使用硬件 ID 和 PLD_Panel 值的组合。

注意

注册表项中的 PLD_Panel 设置是可选的。 Windows 通过 ACPI 表中的设置确定相机的物理位置。

PLD_Panel 注册表值在 ACPI 规范中定义为 _PLD(物理设备位置)。 此值指示相机在机箱中的物理位置,必须是下列值之一。

说明
0 上限
1
2 Left
3 Right
4 Front
5 返回
6 未知(将忽略垂直位置和水平位置)

InternalDeviceModification 注册表项示例

以下示例演示 InternalDeviceModification 注册表项的格式。

{00001111-2222-3333-4444-555566667777}
      HardwareIDs (Multi sz) =
      "USB#VID_1234&PID_ABCD&REV_0001","USB#VID_1234&PID_ABCD"
      PLD_Panel (DWORD) = 4
{88889999-aaaa-bbbb-cccc-ddddeeeeffff}
      HardwareIDs (multi sz) = "USB#VID_5678&PID_WXYZ&REV_0001"
      PLD_Panel (DWORD) = 5
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\InternalDeviceModification]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\InternalDeviceModification\{BBBF38D6-9866-493D-B86F-986E339E096D}]
"PLD_Panel"=dword:00000004
"HardwareIDs"=hex(7):55,00,53,00,42,00,23,00,56,00,49,00,44,00,5f,00,30,00,34,\
  00,35,00,45,00,26,00,50,00,49,00,44,00,5f,00,30,00,30,00,31,00,30,00,23,00,\
  52,00,45,00,56,00,5f,00,30,00,30,00,30,00,31,00,00,00,55,00,53,00,42,00,23,\
  00,56,00,49,00,44,00,5f,00,30,00,34,00,35,00,45,00,26,00,50,00,49,00,44,00,\
  5f,00,30,00,30,00,31,00,30,00,00,00,00,00

元数据结构

内部相机的设备元数据包的结构与任何其他设备的设备元数据包的结构相同。 设备元数据包内 packageinfo.xml 中的 MetadataKey 是使用 InternalDeviceModification 注册表项定义的模型 ID。 Windows 元数据系统基于模型 ID 下载设备元数据包。 不使用内部相机的硬件 ID。

有关为 UWP 设备应用创建设备元数据的详细信息,请参阅构建 UWP 设备应用

预安装

可以使用 OEM 预安装工具包 (OPK) 在设备上预安装 Microsoft Store 设备应用和设备元数据包。

适用于内部设备的 UWP 设备应用