Captura de vídeo da câmera 360
Windows 10, a versão 1803 oferece suporte para visualização, captura e registro de 360 câmeras com APIs MediaCapture existentes. Isso permite que a plataforma exponha fontes de quadro esféricas (por exemplo, quadros equirectangulares), permitindo que os aplicativos detectem e manipulem fluxos de câmera de vídeo 360, bem como forneçam uma experiência de captura 360.
Observação
O exemplo cam360 disponível no GitHub mostra como dar suporte a cenários de visualização, registro de vídeo e captura de fotos com uma câmera 360 no Windows.
Visão geral
Um IHV de câmera 360 pode fornecer plug-ins DMFT (com ou sem drivers UVC personalizados) que exporão o formato esférico de cada fluxo e tipo de mídia que emite quadros esféricos, bem como processará a saída do driver da câmera e fornecerá quadros equirectangulares com atributos e metadados apropriados.
A maioria das 360 câmeras vem com dois sensores de costas para trás e cobrem um FoV 360 com alguma sobreposição. Um IHV normalmente estaria capturando de forma síncrona com os dois sensores de olho de peixe, desajustar e costurar os quadros dentro da DMFT para, em seguida, gerar quadros equirectangulares.
Esses quadros equireectangulares podem ser adquiridos e consumidos pelos aplicativos por meio de APIs MediaCapture e MediaPlayer para projetar uma experiência de visualização de vídeo 360, esférica e panorâmica. Os metadados fornecidos por meio do DMFT serão aproveitados pela plataforma para gravar os vídeos no formato MP4 e colocar implicitamente os metadados padronizados adequados. Quando reproduzido de dentro de um player de vídeo de 360 reprodução, como o aplicativo Movies & TV no Windows 10, o vídeo gravado resultante oferecerá a experiência de visualização esférica esperada.
Uso da câmera 360:
Para visualizar um quadro 360, um aplicativo precisa usar explicitamente o XAML MediaPlayerElement para visualização. Um aplicativo também precisa lidar explicitamente com a interação da interface do usuário para fazer movimento panorâmico por meio do quatérnio MediaPlaybackSphericalVideoProjection.ViewOrientation .
Para o registro de vídeo 360, um aplicativo de captura não precisa ser configurado explicitamente para 360 conteúdo se estiver usando APIs WinRT do MediaCapture, pois o formato esférico é implicitamente passado para o coletor de registro e gravado no cabeçalho do arquivo.
Para a captura de fotos 360, um aplicativo precisa adicionar explicitamente os metadados padronizados apropriados que especificam seu formato esférico usando APIs WinRT do WIC disponíveis.
Cabe ao IHV da câmera 360 implementar um fluxo com uma exibição projetada e expor controles Pan/Tilt/Zoom.
O aplicativo pode implementar e inserir um efeito para gerar uma projeção. O efeito pode aproveitar os atributos no tipo de mídia para identificar quadros equirectangulares.
Arquitetura
O diagrama a seguir ilustra a relação do DMFT com a pilha de câmeras 360:
Os IHVs de 360 câmeras publicarão um DMFT que exporá 360 fluxos de vídeo fornecendo quadros esféricos de um formato definido. O DMFT pode ser instalado e associado à câmera específica por meio do uso do arquivo INF para a extensão de driver, conforme descrito no exemplo . INF abaixo.
A costura e a conversão em quadros equirecngulares podem ocorrer no hardware da câmera ou dentro do DMFT. Pode ser preferível aproveitar o DMFT para essa finalidade, pois permitirá o uso de recursos de hardware como GPU para processamento eficiente. O DMFT também preencherá as seguintes propriedades de fluxo e tipo de mídia (conforme mostrado na tabela abaixo) para identificá-las como 360 fluxos de conteúdo.
Mesmo que o IHV decida fazer a costura no hardware da câmera, um DMFT ainda é um requisito obrigatório para preencher as propriedades de atributo de fluxo e mediatype para o vídeo 360.
A tabela a seguir mostra o atributo de fluxo necessário para identificar uma fonte de quadro esférica:
Nome da propriedade e GUID | Valor | Atributo |
---|---|---|
MF_SD_VIDEO_SPHERICAL {A51DA449-3FDC-478C-BCB5-30BE76595F55} |
TRUE (1) | Stream e MediaType |
MF_SD_VIDEO_SPHERICAL_FORMAT {4A8FC407-6EA1-46C8-B567-6971D4A139C3} |
MFVideoSphericalFormat_Equirectangular (1) | MediaType |
A propriedade acima já existe como parte do mfidl.idl.
Para aproveitar os aplicativos personalizados que também executam a costura, um IHV tem a opção de expor outro tipo de mídia de vídeo 360 não enfeitiçado com atributos definidos como MF_SD_VIDEO_SPHERICAL_FORMAT para MFVideoSphericalFormat_Unsupported(0). O aplicativo personalizado teria que selecionar o fluxo não processado e maniê-lo.
Diretrizes da plataforma
A plataforma já expõe todos os atributos de fluxo à camada WinRT para aplicativos por meio de MediaFrameSourceInfo.Properties, que pode ser pesquisada para o GUID MF_SD_VIDEO_SPHERICAL definido na tabela acima. No entanto, a maioria das configurações esféricas de elementos de plataforma será gerenciada implicitamente pela plataforma. As propriedades podem ser consultadas pelo aplicativo apenas para qualquer funcionalidade extra que o desenvolvedor de aplicativos queira implementar, por exemplo, quaisquer efeitos personalizados que precisem ser inseridos ou removidos dependendo da esférica do vídeo.
A plataforma ignora os efeitos da caixa de entrada, como detecção facial, analisador de cena e estabilização de vídeo (se adicionado) quando detecta o valor da propriedade do atributo de fluxo que indica uma fonte de quadro esférico.
A plataforma configura implicitamente o elemento media player conectado para visualização para a experiência de projeção de vídeo 360. O aplicativo precisa chamar APIs de plataforma apropriadas para selecionar o elemento media player para visualização. O aplicativo também precisa implementar a interface do usuário para controlar a direção e o ângulo da projeção do media player. Se o aplicativo escolher o elemento de captura para visualização, a experiência de projeção esférica não poderá ser aproveitada.
A plataforma também configura implicitamente o coletor MP4 para gravar um vídeo 360 (passar o formato esférico de vídeo apropriado e metadados relacionados se houver disponível e compatível) quando o fluxo usado contiver a propriedade (definida na tabela a seguir) para fornecer o atributo de fluxo necessário para identificar uma fonte de quadro esférica.
MF_SD_VIDEO_SPHERICAL_FORMAT valor (MFVideoSphericalFormat) | Valor SphericalVideoFrameFormat | Interpretação |
---|---|---|
Propriedade encontrada em atributos de tipo de mídia definidos como MFVideoSphericalFormat_Equirectangular de valor (1) | SphericalVideoFrameFormat. Equirectangular | O fluxo fornece quadros esféricos no formato equirectangular acessível por meio do Elemento MediaPlayer. |
Propriedade encontrada em atributos de tipo de mídia definidos como valor MFVideoSphericalFormat_Unsupported (0) | SphericalVideoFrameFormat. Sem suporte | O fluxo fornece quadros esféricos em outro formato que não é compatível com o Elemento MediaPlayer. (Pode ser um formato personalizado compatível com alguns Aplicativos) |
A propriedade está ausente dos atributos de tipo de mídia. | SphericalVideoFrameFormat. Nenhum | O fluxo fornece quadros não esféricos regulares. (não 360) |
Diretrizes do aplicativo
O aplicativo pode usar o controle XAML MediaPlayerElement para aproveitar a experiência de projeção esférica de vídeo 360.
Se a propriedade MF_SD_VIDEO_SPHERICAL_FORMAT existir no tipo de mídia e estiver definida como MFVideoSphericalFormat_Equirectangular, espera-se que os quadros sejam esféricos e possam ser renderizados adequadamente por meio do controle XAML MediaPlayerElement . O aplicativo pode consultar o formato esférico detectado pelo media player verificando as propriedades de MediaPlaybackSphericalVideoProjection obtidas da sessão de reprodução do player de mídia (objMediaPlayer.PlaybackSession.SphericalVideoProjection). O aplicativo precisa definir a propriedade isEnabled como TRUE para iniciar a projeção esférica.
Se o aplicativo implementar seu próprio componente de projeção esférica personalizado, ele poderá consultar a origem do quadro por meio de seu MediaFrameSourceInfo.Properties para as propriedades de vídeo no nível do fluxo esférico, conforme descrito na tabela acima. No entanto, toda a configuração de elemento de plataforma, como visualização do player de mídia e coletor de registros, será configurada implicitamente pela plataforma na detecção das propriedades de vídeo esféricas expostas pela câmera DMFT em atributos de fluxo e tipo de mídia.
. Exemplo de arquivo INF para publicar um DMFT
;=================================================================================
; 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
Exemplo de fluxo de quadros com um dispositivo UVC
(1) Quadro combinado não enfeitiçado saindo de USBVideo.sys:
(2) Quadro incauto, costurado e transformado em equireçãoangular dentro de um DMFT enviado ao elemento de renderização do aplicativo para visualização, para um coletor de vídeo ou coletor de fotos a ser armazenado no arquivo:
(3) Visor renderizado dentro de um aplicativo usando um elemento de interface do usuário que aplica uma projeção esférica, bem como fornece movimento panorâmico de rotação do visor e interação de campo de exibição: