Identifiera och välj kamerafunktioner med kameraprofiler i en WinUI 3-app
Den här artikeln visar hur du använder kameraprofiler för att identifiera och hantera funktionerna i olika videoinspelningsenheter. Detta omfattar uppgifter som att välja profiler som stöder specifika upplösningar eller bildfrekvenser, profiler som stöder samtidig åtkomst till flera kameror och profiler som stöder HDR.
Om kameraprofiler
Kameror på olika enheter har stöd för olika funktioner, inklusive uppsättning avbildningsupplösningar som stöds, bildfrekvens för videoinspelningar och huruvida HDR- eller variabel bildfrekvensinspelningar stöds. En uppsättning funktioner som stöds definieras i ett MediaCaptureVideoProfileMediaDescription-objekt. En kameraprofil, som representeras av ett MediaCaptureVideoProfile objekt, har tre samlingar med mediebeskrivningar; en för fotoinspelning, en för videoinspelning och en annan för videoförhandsgranskning.
Innan du initierar ditt MediaCapture- objekt kan du fråga capture-enheterna på den aktuella enheten för att se vilka profiler som stöds. När du väljer en profil som stöds vet du att insamlingsenheten stöder alla funktioner i profilens mediebeskrivningar. Detta eliminerar behovet av en utvärderings- och felmetod för att avgöra vilka kombinationer av funktioner som stöds på en viss enhet.
Hitta en kamera som stöder kameraprofiler
Om du vill använda kameraprofiler måste du först söka efter en kameraenhet som stöder användning av kameraprofiler. Exemplet nedan visar hur du använder metoden DeviceInformation.FindAllAsync för att hämta en lista över alla tillgängliga videoinspelningsenheter på den aktuella enhetens fram- eller bakpanel. Den loopar igenom alla enheter i listan och anropar den statiska metoden IsVideoProfileSupportedför varje enhet för att se om den stöder videoprofiler.
Om en enhet som stöder kameraprofiler hittas på den angivna panelen returneras värdet ID, som innehåller enhetens ID-sträng.
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;
}
Om enhets-ID:t som returneras från GetVideoProfileSupportedDeviceIdAsync hjälpmetoden är null eller en tom sträng, finns det ingen enhet på den angivna panelen som stöder kameraprofiler. I det här fallet bör du initiera medieinsamlingsenheten utan att använda profiler.
string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);
if (string.IsNullOrEmpty(videoDeviceId))
{
// No devices on the specified panel support video profiles. .
return;
}
Välj en profil baserat på upplösning och bildfrekvens som stöds
Om du vill välja en profil med särskilda funktioner, till exempel med möjligheten att uppnå en viss upplösning och bildfrekvens, använder du metoden som visades tidigare i den här artikeln för att hämta ID:t för en avbildningsenhet som stöder användning av kameraprofiler.
Skapa ett nytt MediaCaptureInitializationSettings-objekt och passera in det valda enhets-ID:t. Anropa den statiska metoden MediaCapture.FindAllVideoProfiles för att få en lista över alla kameraprofiler som stöds av enheten.
Det här exemplet väljer en profil som innehåller ett SupportedRecordMediaDescription-objekt där egenskaperna Width, Heightoch FrameRate matchar de begärda värdena. Om en matchning hittas, anges VideoProfile och RecordMediaDescription inom MediaCaptureInitializationSettings till de värden som returneras från frågan. Om ingen matchning hittas används standardprofilen.
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];
}
När du har fyllt i MediaCaptureInitializationSettings med önskad kameraprofil anropar du helt enkelt InitializeAsync- på medieinspelningsobjektet för att konfigurera den till önskad profil.
await m_mediaCapture.InitializeAsync(mediaInitSettings);
Välj enheter med KnownVideoProfile
Du kan använda klassen MediaFrameSourceGroup för att hämta kameraprofiler med specifika funktioner innan du initierar objektet MediaCapture. Ramkällgrupper gör det möjligt för enhetstillverkare att representera grupper av sensorer eller avbildningsfunktioner som en enda virtuell enhet. Detta möjliggör beräkningsfotograferingsscenarier som att använda djup- och färgkameror tillsammans, men kan också användas för att välja kameraprofiler för enkla inspelningsscenarier. För mer information om hur du använder MediaFrameSourceGroup, se Processa mediaframes med MediaFrameReader.
Exemplet nedan visar hur du använder MediaFrameSourceGroup för att hitta en kameraprofil som stöder det önskade scenariot. Anropa MediaFrameSourceGroup.FindAllAsync för att hämta en lista över alla medieramkällgrupper som är tillgängliga på den nuvarande enheten. Loopa igenom varje källgrupp och anropa MediaCapture.FindKnownVideoProfiles för att hämta en lista över alla videoprofiler för den aktuella källgruppen som stöder den angivna KnownCameraProfile, i det här exemplet används värdet KnownVideoProfile.HighQualityPhoto. Andra värden är till exempel stöd för HDR och variabelfotosekvenser. Om en profil som uppfyller de begärda kriterierna hittas skapar du ett nytt MediaCaptureInitializationSettings-objekt och anger VideoProfile till den valda profilen och VideoDeviceId till egenskapen Id för den aktuella medieramens källgrupp. Använd den här MediaCaptureInitializationSettings-objektet för att initiera objektet 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;
}
}
Kontrollera om en enhet stöder samtidig bild- och videoinspelning
Många enheter har stöd för att samla in foton och video samtidigt. För att avgöra om en avbildningsenhet stöder detta anropar du MediaCapture.FindAllVideoProfiles för att hämta alla kameraprofiler som stöds av enheten. Använd en länkfråga för att hitta en profil som har minst en post för både SupportedPhotoMediaDescription och SupportedRecordMediaDescription vilket innebär att profilen stöder samtidig avbildning.
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;
}
Du kan förfina den här frågan för att leta efter profiler som stöder specifika upplösningar eller andra funktioner förutom samtidig videoinspelning. Du kan också använda MediaCapture.FindKnownVideoProfiles och ange värdet BalancedVideoAndPhoto för att hämta profiler som stöder samtidig avbildning, men att fråga alla profiler ger mer fullständiga resultat.
Relaterade ämnen
Windows developer