Обнаружение и выбор возможностей камеры с профилями камер в приложении WinUI 3
В этой статье показано, как использовать профили камер для обнаружения возможностей различных устройств захвата видео и управления ими. К ним относятся такие задачи, как выбор профилей, поддерживающих определенные разрешения или частоты кадров, профили, поддерживающие одновременный доступ к нескольким камерам и профилям, поддерживающим HDR.
Информация о профилях камеры
Камеры на разных устройствах поддерживают различные возможности, включая набор поддерживаемых разрешений захвата, частоту кадров для видеозахватов, а также поддерживаются ли записи hdR или переменной частоты кадров. Набор поддерживаемых возможностей определяется в объекте MediaCaptureVideoProfileMediaDescription. Профиль камеры, представленный объектом MediaCaptureVideoProfile, содержит три коллекции описаний мультимедиа; один для захвата фотографий, один для захвата видео, а другой — для предварительного просмотра видео.
Прежде чем инициализировать объект MediaCapture, можно запросить устройства записи на текущем устройстве, чтобы узнать, какие профили поддерживаются. При выборе поддерживаемого профиля известно, что устройство записи поддерживает все возможности в описаниях мультимедиа профиля. Это устраняет необходимость в пробном и ошибочном подходе к определению сочетаний возможностей, поддерживаемых на определенном устройстве.
Найдите камеру, поддерживающую профили камеры
Чтобы использовать профили камеры, необходимо сначала проверить устройство камеры, поддерживающее использование профилей камеры. В приведенном ниже примере показано, как использовать метод DeviceInformation.FindAllAsync для получения списка всех доступных устройств записи видео на передней или задней панели текущего устройства. Он выполняет цикл по всем устройствам в списке, вызывая статический метод IsVideoProfileSupportedдля каждого устройства, чтобы определить, поддерживаются ли профили видео.
Если устройство, поддерживающее профили камеры, найдено на указанной панели, возвращается значение Id, содержащее строку идентификатора устройства.
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;
}
Если идентификатор устройства, возвращенный из вспомогательного метода GetVideoProfileSupportedDeviceIdAsync, равен NULL или пустой строке, то на указанной панели нет устройства, поддерживающего профили камеры. В этом случае необходимо инициализировать устройство захвата мультимедиа без использования профилей.
string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);
if (string.IsNullOrEmpty(videoDeviceId))
{
// No devices on the specified panel support video profiles. .
return;
}
Выбор профиля на основе поддерживаемого разрешения и частоты кадров
Чтобы выбрать профиль с определенными возможностями, например с возможностью достижения определенного разрешения и частоты кадров, используйте метод, показанный ранее в этой статье, чтобы получить идентификатор устройства захвата, поддерживающего использование профилей камеры.
Создайте новый объект MediaCaptureInitializationSettings, передавая выбранный идентификатор устройства. Вызовите статический метод MediaCapture.FindAllVideoProfiles, чтобы получить список всех профилей камер, поддерживаемых устройством.
В этом примере выбирается профиль, содержащий объект
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];
}
После того как вы заполните MediaCaptureInitializationSettings нужным профилем камеры, просто вызовите InitializeAsync на объекте захвата мультимедиа, чтобы настроить его на нужный профиль.
await m_mediaCapture.InitializeAsync(mediaInitSettings);
Выбор устройств с помощью KnownVideoProfile
Класс MediaFrameSourceGroup можно использовать для получения профилей камер с определенными возможностями перед инициализацией объекта MediaCapture. Группы источников кадров позволяют производителям устройств представлять группы датчиков или возможностей захвата в виде одного виртуального устройства. Это открывает сценарии вычислительной фотографии, такие как использование глубинных и цветных камер вместе, и может также использоваться для выбора профилей камер для простых сценариев съемки. Дополнительные сведения об использовании MediaFrameSourceGroupсм. в разделе Обработка кадров мультимедиа сMediaFrameReader.
В приведенном ниже примере показано, как использовать MediaFrameSourceGroup для поиска профиля камеры, поддерживающего нужный сценарий. Вызовите MediaFrameSourceGroup.FindAllAsync, чтобы получить список всех групп источников кадров мультимедиа, доступных на текущем устройстве. Выполните цикл по каждой исходной группе и вызовите MediaCapture.FindKnownVideoProfiles, чтобы получить список всех профилей видео для текущей исходной группы, поддерживающей указанный KnownCameraProfile, в этом примере используется значение KnownVideoProfile.HighQualityPhoto. Другие функции включают поддержку HDR и переменных последовательностей фотографий, например. Если найден профиль, соответствующий запрошенным критериям, создайте новый объект MediaCaptureInitializationSettings и установите VideoProfile на выбранный профиль, а VideoDeviceId на свойство Id текущей группы источников мультимедийных кадров. Используйте этот объект MediaCaptureInitializationSettings для инициализации объекта 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;
}
}
Определение того, поддерживает ли устройство одновременную съемку фотографий и видео
Многие устройства поддерживают одновременное запись фотографий и видео. Чтобы определить, поддерживает ли устройство захвата это, вызовите MediaCapture.FindAllVideoProfiles, чтобы получить все профили камеры, поддерживаемые устройством. Используйте ссылочный запрос, чтобы найти профиль, который имеет по крайней мере одну запись как для SupportedPhotoMediaDescription, так и для SupportedRecordMediaDescription, что означает, что профиль поддерживает одновременный захват.
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;
}
Этот запрос можно уточнить, чтобы искать профили, поддерживающие определенные разрешения или другие возможности, помимо одновременной записи видео. Вы также можете использовать MediaCapture.FindKnownVideoProfiles и указать значение BalancedVideoAndPhoto для получения профилей, поддерживающих одновременную запись, но запросы ко всем профилям будут предоставлять более полные результаты.
Связанные разделы
Windows developer