識別內部相機的位置(UWP 裝置應用程式)
本主題提供在 Windows 8.1 系統中支援內部相機的相關信息。 它描述如何識別內建相機的實體位置,使其能正確使用 UWP 應用程式。 它也會說明如何設定模型標識碼,讓相機與UWP裝置應用程式搭配運作。 若要深入瞭解一般 UWP 裝置應用程式,請參閱 滿足 UWP 裝置應用程式。
提供實體位置
具有機械固定方向內建相機的系統必須報告相機的實際位置。 此實體位置資訊會指出相機正向的方向,例如正面或背面,讓在 Windows 8.1 中使用相機的應用程式能夠正確運作。
需要下列兩 個 Windows 硬體認證需求,可讓 Windows 辨識相機的位置:
System.Client.PCContainer.PCAppearsAsSingleObject。 相機必須分組到計算機的裝置容器中,其中包含位於計算機內部的裝置功能。 相機必須分組到計算機的裝置容器中,才能將其實體位置公開給應用程式,因為計算機容器外部的裝置不會假設有機械固定方向。
System.Client.網路攝影機.PhysicalLocation。 韌體必須提供實體位置資訊,方法是使用 ACPI 數據表中的_PLD資訊來指出相機的位置和方向。
為什麼 Windows 需要實體位置相機
Windows 必須知道內部相機的實體位置,原因如下:
UWP 應用程式會使用實體位置來判斷如果有多個相機存在時要使用的相機。 例如,聊天應用程式預設會使用應用程式啟動時面對使用者的前端相機。
UWP 應用程式會使用實體位置來判斷如何鏡像或旋轉視訊預覽。
如果相機面對使用者,預覽看起來應該就像使用者正在查看鏡像一樣。 若要這樣做,應用程式會翻轉預覽的左右兩側,讓預覽鏡像視訊。 如果相機遠離使用者,應用程式就不需要鏡像視訊。
如果應用程式旋轉預覽,旋轉的程度會根據相機的位置而有所不同。
如何將相機分組到計算機裝置容器
根據認證需求 System.Client.PCContainer.PCAppearsAsSingleObject,也稱為 SYSFUND-0200,內部相機裝置節點必須分組在 PC 裝置容器下。 換句話說,內部相機不應該顯示在裝置和印表機中,而且必須合併到計算機容器中。
實作這項需求的方式取決於內部相機的總線類型。 如果裝置可以在 ACPI 數據表中的實體裝置位置公開資訊,可以在 ACPI 層中指定正確的群組,方法是在數據表中包含_PLD資訊,以及修改 ACPI 數據表中的 UserVisible 旗標,如多功能裝置支援和裝置容器群組中所述。 否則,請使用 DeviceOverrides 登錄機碼覆寫卸除式旗標。 如需詳細資訊,請參閱 DeviceOverrides 登錄機碼。
如何使用 ACPI 數據表中的_PLD資訊提供實體位置
根據認證需求 System.Client.網路攝影機.PhysicalLocation,_PLD值,指出相機的位置必須在 ACPI (進階設定和電源介面) 數據表中提供。 這適用於任何內建於系統底座且具有機械固定方向的相機裝置。 韌體必須提供 _PLD 方法,並將面板欄位 (位 69:67) 設定為相機所掛接面板的適當值。 例如,Front 表示相機面對使用者(網路攝影機),而Back則表示相機會遠離終端使用者(靜止或視訊相機)。
位值 69:67 | 面板 |
---|---|
0 | 前幾個 |
1 | 下方 |
2 | Left |
3 | Right |
4 | 前面 |
5 | Back |
6 | 未知 |
此外,位 143:128(垂直位移),位 159:144(水準位移)必須提供相機相對於顯示器的相對位置。 此原點相對於顯示元件中的原生像素尋址,而且應該符合目前橫向或直向的顯示方向。 原點是顯示器的左下角,其中正水準和垂直位移值分別位於右邊和向上。
針對USB連線的內部相機,USB裝置的裝置節點將會建立在USB埠裝置節點下的ACPI數據表中。
若要指定位址 (_ADR):
將 Windows 安裝到目標電腦
移至 裝置管理員
選取並按住 (或以滑鼠右鍵按兩鍵按下) 您的目標網路攝影機,然後選取 [ 屬性]
開啟 [詳細數據] 索引標籤,然後在 [屬性] 功能選取 [位址]
[ 值 ] 方塊中的值是您裝置所在的位址
在 ACPI 資料表中設定 _ADR 中的值
根據 ACPI 規格和電腦設計來設定_PLD值
此範例是USB連線相機的ACPI數據表。 在此範例中,值為 0x1。 第九個字節包含位置的面板程序代碼(bits[69:67])。 請注意,如果裝置是USB複合裝置,PLD必須位於視訊 FUNCTION 上。 這表示需要額外的 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 複合樣式裝置),則位址值只會使用埠號碼來計算。
提供模型標識碼
只有在相機的裝置節點具有 型號標識碼 屬性且裝置類別為 Imaging.Webcam
時,Windows 裝置元數據系統才能查詢內部內嵌相機的裝置元數據套件。 若要讓內部相機的元數據可供 Windows 探索,讓裝置元數據套件與裝置和相機特定的 UWP 裝置應用程式正確產生關聯,OEM 必須執行下列動作:
- 使用
InternalDeviceModification
裝置登錄機碼中的旗標,在裝置節點中設定模型標識符
如何設定內部相機裝置節點的型號標識碼
針對內部相機,OEM 會建立 GUID 以用於模型識別碼,併為其建立登錄機碼。 模型標識符屬性是使用 InternalDeviceModification 機制新增至裝置節點,這是登錄型查閱表 (LUT),其中包含對應至特定裝置的登錄機碼。 此 InternalDeviceModification 數據表會在下列登錄機碼下維護:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\InternalDeviceModification
在 InternalDeviceModification 登錄機碼下建立的子機碼專案是 ModelID 的 OEM 提供的 GUID。 此機碼的存在會根據 ACPI 數據表中_PLD值所指示的裝置硬體識別碼和位置資訊,將模型標識元新增至相機的裝置節點。
InternalDeviceModification 登錄機碼
InternalDeviceModification 登錄機碼表示至少有一個相機使用 ModelID。
登錄機碼名稱 | InternalDeviceModification |
---|---|
必要條件/選擇性 | 必要 |
路徑 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control |
格式需求 | 無 |
有效的子機碼 | 模型識別元登錄機碼 (請參閱下列子機碼格式需求和範例) |
模型標識元登錄機碼
登錄機碼名稱 | 模型識別碼(確切的模型識別碼值是索引鍵名稱) |
---|---|
必要條件/選擇性 | 必要 |
格式需求 | 金鑰名稱是 OEM 所建立的 GUID。 它必須同時有左括弧和右括弧。 |
有效值 | 硬體標識元登錄值 或 PLD_Panel |
範例 | {43922620-DAD9-4C05-BE3F-F65B089D84D8} |
硬體標識元登錄值
登錄值名稱 | HardwareIDs |
---|---|
必要條件/選擇性 | 必要 |
類型 | 多字串 |
格式需求 | 必須包含硬體標識碼的總線前置詞。 所有「字元都必須取代為」#」。 |
範例 | USB#VID_1234&PID_ABCD&REV_0001 , PCI#VEN_ABCD&DEV_1234&SUBSYS_000 |
註解 | 您可以提供多個硬體識別碼值。 當清單中出現任何硬體標識碼一次以上時,系統會根據硬體標識碼來設定裝置節點的模型標識碼。 |
PLD_Panel登錄值
登錄值名稱 | PLD_Panel |
---|---|
必要條件/選擇性 | 選擇性 |
類型 | 下載 |
格式需求 | 必須包含 HardwareID 的總線前置詞。 所有 “\” 字元都必須取代為 “#”。 |
範例 | 4.5 |
PLD_Panel詳細數據
ACPI 數據表中提供的PLD_Panel值可讓相機在系統有兩個相同的相機裝置且具有相同的硬體標識符時彼此區別。 若要建立不同的模型標識碼,會使用硬體標識碼和PLD_Panel值的組合。
注意
登錄機碼中的PLD_Panel設定是選擇性的。 Windows 會依據 ACPI 數據表中的設定來判斷相機的實體位置。
PLD_Panel登錄值會定義為 ACPI 規格中的 _PLD (實體裝置位置)。 這個值,表示相機在其機箱中的實體位置,必須是下列其中一項。
值 | 描述 |
---|---|
0 | 前幾個 |
1 | 下方 |
2 | Left |
3 | Right |
4 | 前面 |
5 | Back |
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 登錄機碼所定義的模型標識碼。 Windows 元數據系統會根據模型標識碼下載裝置元數據套件。 不會使用內部相機的硬體標識碼。
如需為 UWP 裝置應用程式建立裝置元資料的詳細資訊,請參閱 建置 UWP 裝置應用程式。
安裝前
Microsoft Store 裝置應用程式和裝置元資料套件都可以使用 OEM 預安裝套件 (OPK) 在裝置上預安裝。