Detección y selección de funcionalidades de cámara con perfiles de cámara en una aplicación WinUI 3
En este artículo se muestra cómo usar perfiles de cámara para detectar y administrar las funcionalidades de diferentes dispositivos de captura de vídeo. Esto incluye tareas como seleccionar perfiles que admiten resoluciones específicas o velocidades de fotogramas, perfiles que admiten el acceso simultáneo a varias cámaras y perfiles que admiten HDR.
Acerca de los perfiles de cámara
Las cámaras en diferentes dispositivos admiten diferentes funcionalidades, como el conjunto de resoluciones de captura admitidas, la velocidad de fotogramas para las capturas de vídeo y si se admiten capturas de velocidad de fotogramas HDR o variable. Un conjunto de funcionalidades admitidas se define en un objeto MediaCaptureVideoProfileMediaDescription. Un perfil de cámara, representado por un objeto MediaCaptureVideoProfile, tiene tres colecciones de descripciones multimedia; una para la captura de fotos, otra para la captura de vídeo y otra para la vista previa de vídeo.
Antes de inicializar el objeto MediaCapture, puede consultar los dispositivos de captura en el dispositivo actual para ver qué perfiles se admiten. Al seleccionar un perfil compatible, sabe que el dispositivo de captura admite todas las funcionalidades de las descripciones multimedia del perfil. Esto elimina la necesidad de un enfoque de prueba y error para determinar qué combinaciones de funcionalidades se admiten en un dispositivo determinado.
Buscar una cámara que admita perfiles de cámara
Para usar perfiles de cámara, primero debe comprobar si hay un dispositivo de cámara que admita el uso de perfiles de cámara. En el ejemplo siguiente se muestra cómo usar el método DeviceInformation.FindAllAsync para recuperar una lista de todos los dispositivos de captura de vídeo disponibles en el panel frontal o posterior del dispositivo actual. Recorre en bucle todos los dispositivos de la lista, llamando al método estático, IsVideoProfileSupported, para cada dispositivo para ver si admite perfiles de vídeo.
Si se encuentra un dispositivo que admite perfiles de cámara en el panel especificado, se devuelve el valor , que contiene la cadena de identificación del dispositivo.
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;
}
Si el identificador de dispositivo devuelto desde el GetVideoProfileSupportedDeviceIdAsync método auxiliar es null o una cadena vacía, no hay ningún dispositivo en el panel especificado que admita perfiles de cámara. En este caso, debe inicializar el dispositivo de captura multimedia sin usar perfiles.
string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);
if (string.IsNullOrEmpty(videoDeviceId))
{
// No devices on the specified panel support video profiles. .
return;
}
Selecciona un perfil basado en la resolución y la velocidad de fotogramas admitidas
Para seleccionar un perfil con funcionalidades concretas, como con la capacidad de lograr una resolución determinada y una velocidad de fotogramas, use el método mostrado anteriormente en este artículo para obtener el identificador de un dispositivo de captura que admita el uso de perfiles de cámara.
Cree un nuevo objeto MediaCaptureInitializationSettings y pase el identificador de dispositivo seleccionado. Llame al método estático MediaCapture.FindAllVideoProfiles para obtener una lista de todos los perfiles de cámara compatibles con el dispositivo.
En este ejemplo se selecciona un perfil que contiene un Descripción de medios de registro soportados objeto en el que el Ancho, Altura, y Velocidad de fotogramas Las propiedades coinciden con los valores solicitados. Si se encuentra una coincidencia, los VideoProfile y RecordMediaDescription de los MediaCaptureInitializationSettings se establecen en los valores devueltos desde la consulta. Si no se encuentra ninguna coincidencia, se usa el perfil predeterminado.
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];
}
Después de rellenar MediaCaptureInitializationSettings con el perfil de cámara deseado, simplemente llame a InitializeAsync en el objeto de captura multimedia para configurarlo con el perfil deseado.
await m_mediaCapture.InitializeAsync(mediaInitSettings);
Selección de dispositivos con KnownVideoProfile
Puede usar la clase
En el ejemplo siguiente se muestra cómo usar MediaFrameSourceGroup para buscar un perfil de cámara compatible con el escenario deseado. Llame a mediaFrameSourceGroup.FindAllAsync para obtener una lista de todos los grupos de origen de fotogramas multimedia disponibles en el dispositivo actual. Recorre en bucle cada grupo de origen y llama a MediaCapture.FindKnownVideoProfiles para obtener una lista de todos los perfiles de vídeo del grupo de origen actual que admiten el KnownCameraProfile especificado, en este ejemplo se usa el valor KnownVideoProfile.HighQualityPhoto. Otros valores incluyen compatibilidad con HDR y secuencias de fotos variables, por ejemplo. Si se encuentra un perfil que cumple con los criterios solicitados, cree un nuevo archivo Configuración de inicialización de captura de medios objeto y establezca el objeto VideoPerfil al perfil Select y al IdDelDispositivuDeVideo al Identificación del grupo de orígenes de tramas multimedia actual. Utilice este objeto MediaCaptureInitializationSettings para inicializar el objeto MediaCapture.
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 si un dispositivo admite la captura simultánea de fotos y vídeos
Muchos dispositivos admiten la captura simultánea de fotos y vídeos. Para determinar si un dispositivo de captura admite esto, llame a MediaCapture.FindAllVideoProfiles para obtener todos los perfiles de cámara compatibles con el dispositivo. Utilice una consulta de vínculo para buscar un perfil que tenga al menos una entrada para SupportedPhotoMediaDescription y SupportedRecordMediaDescription, lo que significa que el perfil admite la 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;
}
Puede refinar esta consulta para buscar perfiles que admitan resoluciones específicas u otras funcionalidades además de la grabación simultánea de vídeo. También puede usar el MediaCapture.FindKnownVideoProfiles y especificar el valor de BalancedVideoAndPhoto para recuperar perfiles que son compatibles con la captura simultánea, pero consultar todos los perfiles proporcionará resultados más completos.