Descubra e selecione recursos de câmera com perfis de câmera em um aplicativo WinUI 3
Este artigo mostra como usar perfis de câmera para descobrir e gerenciar os recursos de diferentes dispositivos de captura de vídeo. Isso inclui tarefas como selecionar perfis que suportam resoluções ou taxas de quadros específicas, perfis que suportam acesso simultâneo a várias câmeras e perfis que suportam HDR.
Sobre perfis de câmera
As câmeras em diferentes dispositivos suportam diferentes recursos, incluindo o conjunto de resoluções de captura suportadas, taxa de quadros para capturas de vídeo e se as capturas HDR ou taxa de quadros variável são suportadas. Um conjunto de capacidades suportadas é definido num objeto MediaCaptureVideoProfileMediaDescription. Um perfil de câmera, representado por um objeto MediaCaptureVideoProfile
Antes de inicializar o seu objeto MediaCapture , pode consultar os dispositivos de captura no dispositivo atual para ver quais perfis são suportados. Ao selecionar um perfil suportado, você sabe que o dispositivo de captura suporta todos os recursos nas descrições de mídia do perfil. Isso elimina a necessidade de uma abordagem de tentativa e erro para determinar quais combinações de recursos são suportadas em um dispositivo específico.
Encontre uma câmara que suporte perfis de câmara
Para usar perfis de câmera, você deve primeiro verificar se há um dispositivo de câmera que suporte o uso de perfis de câmera. O exemplo abaixo mostra como usar o método DeviceInformation.FindAllAsync para recuperar uma lista de todos os dispositivos de captura de vídeo disponíveis no painel frontal ou traseiro do dispositivo atual. Ele percorre todos os dispositivos na lista, chamando o método estático, IsVideoProfileSupported, para cada dispositivo para ver se ele suporta perfis de vídeo.
Se um dispositivo que suporta perfis de câmara for encontrado no painel especificado, o valor de Id, contendo a cadeia de caracteres do ID do dispositivo, será retornado.
public async Task<string> GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel panel)
{
string deviceId = string.Empty;
// Finds all video capture devices
DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
foreach (var device in devices)
{
// Check if the device on the requested panel supports Video Profile
if (MediaCapture.IsVideoProfileSupported(device.Id) && device.EnclosureLocation.Panel == panel)
{
// We've located a device that supports Video Profiles on expected panel
deviceId = device.Id;
break;
}
}
return deviceId;
}
Se o ID do dispositivo retornado pelo método auxiliar GetVideoProfileSupportedDeviceIdAsync for nulo ou uma cadeia de caracteres vazia, não há nenhum dispositivo no painel especificado que suporte perfis de câmera. Nesse caso, você deve inicializar seu dispositivo de captura de mídia sem usar perfis.
string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);
if (string.IsNullOrEmpty(videoDeviceId))
{
// No devices on the specified panel support video profiles. .
return;
}
Selecione um perfil com base na resolução e taxa de quadros suportadas
Para selecionar um perfil com recursos específicos, como a capacidade de alcançar uma resolução e taxa de quadros específicas, use o método mostrado anteriormente neste artigo para obter a ID de um dispositivo de captura que suporte o uso de perfis de câmera.
Crie um novo objeto MediaCaptureInitializationSettings, passando o ID do dispositivo escolhido. Chame o método estático MediaCapture.FindAllVideoProfiles para obter uma lista de todos os perfis de câmera suportados pelo dispositivo.
Este exemplo seleciona um perfil que contém um objeto SupportedRecordMediaDescription em que as propriedades Width, Heighte FrameRate correspondem aos valores solicitados. Se uma correspondência for encontrada, VideoProfile e RecordMediaDescription do MediaCaptureInitializationSettings serão definidos pelos valores retornados da consulta. Se nenhuma correspondência for encontrada, o perfil padrão será usado.
var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = videoDeviceId };
IReadOnlyList<MediaCaptureVideoProfile> profiles = MediaCapture.FindAllVideoProfiles(videoDeviceId);
var match = (from profile in profiles
from desc in profile.SupportedRecordMediaDescription
where desc.Width == 640 && desc.Height == 480 && Math.Round(desc.FrameRate) == 30
select new { profile, desc }).FirstOrDefault();
if (match != null)
{
mediaInitSettings.VideoProfile = match.profile;
mediaInitSettings.RecordMediaDescription = match.desc;
}
else
{
// Could not locate a WVGA 30FPS profile, use default video recording profile
mediaInitSettings.VideoProfile = profiles[0];
}
Depois de preencher o MediaCaptureInitializationSettings
await m_mediaCapture.InitializeAsync(mediaInitSettings);
Selecionar dispositivos com KnownVideoProfile
Você pode usar a classe
O exemplo abaixo mostra como usar MediaFrameSourceGroup para encontrar um perfil de câmara que suporte o cenário desejado. Chame MediaFrameSourceGroup.FindAllAsync para obter uma lista de todos os grupos de origem de quadros de mídia disponíveis no dispositivo atual. Percorra cada grupo de origem e chame
IReadOnlyList<MediaFrameSourceGroup> sourceGroups = await MediaFrameSourceGroup.FindAllAsync();
MediaCaptureInitializationSettings settings = null;
foreach (MediaFrameSourceGroup sg in sourceGroups)
{
IReadOnlyList<MediaCaptureVideoProfile> profileList = MediaCapture.FindKnownVideoProfiles(
sg.Id,
KnownVideoProfile.HighQualityPhoto);
if (profileList.Count > 0)
{
settings = new MediaCaptureInitializationSettings();
settings.VideoProfile = profileList[0];
settings.VideoDeviceId = sg.Id;
break;
}
}
Determinar se um dispositivo suporta captura simultânea de fotos e vídeos
Muitos dispositivos suportam a captura de fotos e vídeos simultaneamente. Para determinar se um dispositivo de captura suporta isso, chame MediaCapture.FindAllVideoProfiles para obter todos os perfis de câmera suportados pelo dispositivo. Use uma consulta de link para encontrar um perfil que tenha pelo menos uma entrada para ambos SupportedPhotoMediaDescription e SupportedRecordMediaDescription, o que indica que o perfil suporta captura simultânea.
bool simultaneousPhotoAndVideoSupported = false;
IReadOnlyList<MediaCaptureVideoProfile> profiles = MediaCapture.FindAllVideoProfiles(videoDeviceId);
var match = (from profile in profiles
where profile.SupportedPhotoMediaDescription.Any() &&
profile.SupportedRecordMediaDescription.Any()
select profile).FirstOrDefault();
if (match != null)
{
// Simultaneous photo and video supported
simultaneousPhotoAndVideoSupported = true;
}
else
{
// Simultaneous photo and video not supported
simultaneousPhotoAndVideoSupported = false;
}
Você pode refinar essa consulta para procurar perfis que ofereçam suporte a resoluções específicas ou outros recursos, além da gravação simultânea de vídeo. Você também pode usar o MediaCapture.FindKnownVideoProfiles e especificar o valor de BalancedVideoAndPhoto para recuperar perfis que suportam captura simultânea, mas consultar todos os perfis fornecerá resultados mais completos.
Tópicos relacionados
Windows developer