Windows 10 版本 1803 支持使用现有 MediaCapture API 进行 360 相机预览、捕获和录制。 这使平台能够公开球面帧源(例如,等角帧),使应用能够检测和处理 360 个视频相机流,并提供 360 个捕获体验。
注释
GitHub 上提供的 Cam360 示例演示如何在 Windows 上使用 360 相机支持预览、视频录制和照片捕获方案。
概述
360 相机的 IHV 可以提供 DMFT 插件(无论是否带有自定义 UVC 驱动程序),这些插件将公开发出球形帧的每个流和媒体类型的球面格式,并处理相机驱动程序的输出。此外,它们将提供具有适当属性和元数据的等距柱状帧。
大多数 360 度相机配有 2 个背靠背的传感器,并覆盖 360 度视场(FoV),带有一些重叠。 IHV 通常会与两个鱼眼传感器同步捕获,在 DMFT 内展开并缝合这些帧,然后输出等距长方体帧。
然后,应用可以通过 MediaCapture 和 MediaPlayer API 获取和使用这些等角矩形帧,提供 360 度球形的视频预览体验,实现平移效果。 平台将利用通过 DMFT 提供的元数据以 MP4 格式录制视频,并隐式地将正确的标准化元数据括起来。 从 Windows 10 上的 360 播放视频播放器(如 电影和电视 应用)中播放时,生成的录制视频将提供预期的球形视图平移体验。
360 相机使用情况:
若要预览 360 帧,应用程序需要显式使用 XAML MediaPlayerElement 来预览。 应用程序还需要通过 MediaPlaybackSphericalVideoProjection.ViewOrientation quaternion 显式处理用于平移的 UI 交互。
对于 360 视频记录,如果捕获应用程序使用 MediaCapture WinRT API,则不需要为 360 内容显式配置捕获应用程序,因为球形格式将隐式传递到记录接收器并写入文件头。
对于 360 照片捕获,应用程序需要显式添加相应的标准化元数据,以使用可用的 WIC WinRT API 指定其球形格式。
由 360 相机 IHV 决定实现投影视图的流,并提供平移/倾斜/缩放控件。
应用程序可以实现并插入效果以生成投影。 该效果可以利用媒体类型上的属性来标识等角帧。
建筑
下图说明了 DMFT 与 360 相机堆栈的关系:
360 相机 IHV 将发布 DMFT,该 DMFT 将公开 360 个视频流,提供定义格式的球面帧。 可以通过使用 INF 文件作为驱动程序扩展来安装 DMFT,并将其与特定相机关联,如下示例 INF 中所述。
缝合和转换为等距矩形帧的过程可以在相机硬件或 DMFT 中进行。 最好利用 DMFT 实现此目的,因为它允许使用 GPU 等硬件资源进行高效处理。 DMFT 还将填充以下流和媒体类型属性(如下表所示),将其标识为 360 内容流。
即使 IHV 决定在相机硬件中完成缝合,DMFT 仍然是填充 360 视频的流和媒体类型属性的必需要求。
下表显示了标识球面帧源所需的流属性:
| 属性名称和 GUID | 价值 | 特征 |
|---|---|---|
| MF_SD_VIDEO_SPHERICAL(视频球形) {A51DA449-3FDC-478C-BCB5-30BE76595F55} |
TRUE (1) | Stream 和 MediaType |
| MF_SD_VIDEO_SPHERICAL_FORMAT {4A8FC407-6EA1-46C8-B567-6971D4A139C3} |
MFVideoSphericalFormat_Equirectangular (1) | MediaType |
上述属性已作为 mfidl.idl 的一部分存在。
为了利用能够执行缝合的自定义应用,IHV 可以选择公开另一种未缝合的 360 视频媒体类型,并将属性设置为 MF_SD_VIDEO_SPHERICAL_FORMAT 并且值为 MFVideoSphericalFormat_Unsupported(0)。 自定义应用程序必须选择未处理的流并对其进行处理。
平台指南
该平台已经通过 MediaFrameSourceInfo.Properties 将所有流属性公开给 WinRT 层的应用程序,这些属性中可以搜索到上表中定义的 MF_SD_VIDEO_SPHERICAL GUID。 但是,平台元素的大部分球形配置将由平台隐式管理。 应用程序只能查询属性,以便应用程序开发人员可能想要实现的任何额外功能,例如,需要插入或删除的任何自定义效果,具体取决于视频的球面性。
当平台检测到指示球面帧源的流属性值时,平台将跳过内置效果,例如人脸检测、场景分析和视频防抖动(如果已添加)。
平台隐式配置连接用于预览的媒体播放器元素,以获得360度视频投影体验。 应用程序必须调用适当的平台 API 来选择媒体播放器元素以供预览。 应用程序还必须实现 UI 来控制媒体播放器的投影方向和角度。 如果应用程序选择用于预览的捕获元素,则无法利用球面投影体验。
当使用的流包含属性(在下表中定义)时,平台还会隐式地配置 MP4 接点,以录制 360度视频(如果可用且受支持),从而使用合适的视频球面格式和相关元数据,提供所需的流属性以标识球形帧源。
| MF_SD_VIDEO_SPHERICAL_FORMAT值 (MFVideoSphericalFormat) | SphericalVideoFrameFormat 值 | 解释 |
|---|---|---|
| 在媒体类型属性中找到其值设置为 MFVideoSphericalFormat_Equirectangular (1)的特性 | SphericalVideoFrameFormat。 Equirectangular | 该流以等距矩形格式提供球形帧以供 MediaPlayer 元素查看。 |
| 在媒体类型属性中找到的属性被设置为 MFVideoSphericalFormat_Unsupported (0) | 球面视频帧格式。 不支持 | 该流以与 MediaPlayer Element 不兼容的另一种格式提供球形帧。 (可能是某些应用支持的自定义格式) |
| 媒体类型的属性中没有该属性。 | SphericalVideoFrameFormat。 没有 | 该流提供常规的非球面帧。 (非 360) |
应用程序指南
应用程序可以使用 MediaPlayerElement XAML 控件来利用 360 视频球面投影体验。
如果媒体类型上存在MF_SD_VIDEO_SPHERICAL_FORMAT属性并且设置为MFVideoSphericalFormat_Equirectangular,则帧应为球形,并且可以通过 MediaPlayerElement XAML 控件适当呈现。 应用程序可以通过检查从媒体播放器播放会话(objMediaPlayer.PlaybackSession.SphericalVideoProjection)获取的 MediaPlaybackSphericalVideoProjection 的属性来查询媒体播放器检测到的球形格式。 应用程序必须将 isEnabled 属性设置为 TRUE 才能启动球面投影。
如果应用程序实现自己的自定义球面投影组件,则它可以通过其 MediaFrameSourceInfo.Properties 查询帧源,以获取球面流级视频属性,如上表所述。 但是,所有平台元素配置(如媒体播放器预览和记录接收接口)都将由平台隐式配置,以便根据流和媒体类型属性检测由相机 DMFT 公开的球形视频属性。
用于发布 DMFT 的 INF 文件示例
;=================================================================================
; Microsoft Sample Extension INF for USB Camera SampleDeviceMFT installation
; Copyright (C) Microsoft Corporation. All rights reserved.
;=================================================================================
[Version]
Signature="$WINDOWS NT$"
Class=Extension
ClassGUID={e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider=%CONTOSO%
ExtensionId = {E4FE3A00-68CF-45A3-83C8-8347A6A38069} ; replace with your own GUID
CatalogFile.NT = SampleExtensionInfForDmftInstallation.cat
DriverVer=03/28/2024,10.0.25326.2000
PnpLockdown=1
[Manufacturer]
%CONTOSO% = ContosoSampleDeviceMFT,ntamd64.10.0...25326
[ContosoSampleDeviceMFT.ntamd64.10.0...25326]
%ContosoCamera.DeviceDesc% = ContosoSampleDeviceMFT_Install, usb\vid_xxxx&pid_xxxx&mi_xx ; replace with your camera device VID PID
[ContosoSampleDeviceMFT_Install]
CopyFiles=ContosoSampleDeviceMFTCopy
AddReg=ContosoSampleDeviceMFT_COM.AddReg
;-----------------------------------------------------------------------------------
;
; Registers Device MFT COM object
;
;-----------------------------------------------------------------------------------
[ContosoSampleDeviceMFT_COM.AddReg]
HKR,Classes\CLSID\%SampleDeviceMFT.CLSID%,,,%SampleDeviceMFT.FriendlyName%
HKR,Classes\CLSID\%SampleDeviceMFT.CLSID%\InProcServer32\,,%REG_EXPAND_SZ%,"%13%\ContosoSampleDeviceMFT.dll"
HKR,Classes\CLSID\%SampleDeviceMFT.CLSID%\InProcServer32\,ThreadingModel,,"Both"
[ContosoSampleDeviceMFT_Install.Interfaces]
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,,ContosoSampleDeviceMFT.Interfaces,
[ContosoSampleDeviceMFT.Interfaces]
AddReg=ContosoSampleDeviceMFT.AddReg
;-----------------------------------------------------------------------------------
;
; Add DeviceMFT CLSID to device interface instance registry key
;
;-----------------------------------------------------------------------------------
[ContosoSampleDeviceMFT.AddReg]
HKR,,CameraDeviceMftClsid,,%SampleDeviceMFT.CLSID%
;-----------------------------------------------------------------------------------
;
; File copy sections
;
;-----------------------------------------------------------------------------------
[SourceDisksFiles]
ContosoSampleDeviceMFT.dll=1
[SourceDisksNames]
1 = %MediaDescription%
[DestinationDirs]
ContosoSampleDeviceMFTCopy=13
DefaultDestDir = 13
[ContosoSampleDeviceMFTCopy]
ContosoSampleDeviceMFT.dll
[Strings]
CONTOSO = "Contoso Inc."
ContosoCamera.DeviceDesc = "Contoso Camera Extension"
MediaDescription="Contoso Camera Sample Device MFT Installation Media"
SampleDeviceMFT.CLSID = "{zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz}" ; replace with your Device MFT COM object's CoClass ID
SampleDeviceMFT.FriendlyName = "Contoso Camera Device MFT"
KSCATEGORY_VIDEO_CAMERA="{E5323777-F976-4f5b-9B55-B94699C46E44}"
REG_EXPAND_SZ=0x00020000
使用 UVC 设备的示例帧流
(1)从 USBVideo.sys输出的未拼接组合帧:
(2)在 DMFT 内,将帧校正畸变、拼接并转换为等距矩形格式,发送给应用程序的渲染组件以进行预览,或发送到视频存储器或照片存储器以保存到文件中:
(3)在应用程序中使用应用球面投影的 UI 元素呈现视口,并提供视口旋转、平移和视野交互功能。