360 相机视频捕获
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 格式录制视频,并隐式包含适当的标准化元数据。 从 360 个播放的视频播放器(如 Windows 10 上的电影 & 电视应用)中播放时,生成的录制视频将提供预期的球面视图平移体验。
360 相机使用情况:
若要预览 360 帧,应用程序确实需要显式使用 XAML MediaPlayerElement 进行预览。 应用程序还需要通过 MediaPlaybackSphericalVideoProjection.ViewOrientation quaternion 显式处理用于平移的 UI 交互。
对于 360 视频记录,如果捕获应用程序使用 MediaCapture WinRT API,则无需显式配置 360 内容,因为球面格式将隐式传递到记录接收器并写入文件标头。
对于 360 照片捕获,应用程序需要显式添加适当的标准化元数据,以使用可用的 WIC WinRT API 指定其球形格式。
它由 360 相机 IHV 来实现具有投影视图的流并公开平移/倾斜/缩放控件。
应用程序可以实现并插入效果以生成投影。 该效果可以利用 mediatype 上的属性来识别等距的矩形框架。
体系结构
下图演示了 DMFT 与 360 相机堆栈的关系:
360 相机 IHV 将发布 DMFT,该 DMFT 将公开 360 个视频流,提供已定义格式的球面帧。 可以通过将 INF 文件用于驱动程序扩展来安装 DMFT 并将其与特定相机相关联,如示例 中所述。下面的 INF。
在相机硬件或 DMFT 内部可以进行等距棱镜框的拼接和转换。 最好利用 DMFT 实现此目的,因为它允许使用 GPU 等硬件资源进行高效处理。 DMFT 还将填充以下流和媒体类型属性, (如下表所示,) 将它们标识为 360 个内容流。
即使 IHV 决定在相机硬件中完成拼接,DMFT 仍然是填充 360 视频的流和 mediatype 属性属性的必需要求。
下表显示了标识球面帧源所需的流属性:
属性名称和 GUID | Value | Attribute |
---|---|---|
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) | SphericalVideoFrameFormat。 不支持 | 该流以另一种格式提供与 MediaPlayer 元素不兼容的球面帧。 (可能是某些应用支持的自定义格式) |
媒体类型属性中不存在属性。 | SphericalVideoFrameFormat。 无 | 该流提供常规的非球形帧。 (非 360) |
应用程序准则
应用程序可以使用 MediaPlayerElement XAML 控件来利用 360 视频球面投影体验。
如果媒体类型上存在 MF_SD_VIDEO_SPHERICAL_FORMAT 属性,并且设置为 MFVideoSphericalFormat_Equirectangular,则帧应为球形,并且可以通过 MediaPlayerElement XAML 控件正确呈现。 应用程序可以通过检查从媒体播放器播放会话获取的 MediaPlaybackSpherVideoProjection (objMediaPlayer.PlaybackSession.SphericalVideoProjection) 来查询媒体播放器检测到的球形格式。 应用程序必须将 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 元素在应用程序中呈现的视区,该元素应用球面投影并提供视区旋转平移和视场交互: