Delen via


Cameramogelijkheden ontdekken en selecteren met cameraprofielen in een WinUI 3-app

In dit artikel wordt beschreven hoe u cameraprofielen kunt gebruiken om de mogelijkheden van verschillende videoopnameapparaten te detecteren en te beheren. Dit omvat taken zoals het selecteren van profielen die ondersteuning bieden voor specifieke resoluties of framesnelheden, profielen die ondersteuning bieden voor gelijktijdige toegang tot meerdere camera's en profielen die HDR ondersteunen.

Over cameraprofielen

Camera's op verschillende apparaten ondersteunen verschillende mogelijkheden, waaronder de set ondersteunde opnameresoluties, framesnelheid voor videoopnamen en of HDR- of variabele framesnelheidopnamen worden ondersteund. Een set ondersteunde mogelijkheden wordt gedefinieerd in een MediaCaptureVideoProfileMediaDescription object. Een cameraprofiel, vertegenwoordigd door een MediaCaptureVideoProfile object, heeft drie verzamelingen mediabeschrijvingen; een voor foto-opname, een voor video-opname en een voor videovoorbeeld.

Voordat u uw MediaCapture--object initialiseert, kunt u een query uitvoeren op de opnameapparaten op het huidige apparaat om te zien welke profielen worden ondersteund. Wanneer u een ondersteund profiel selecteert, weet u dat het opnameapparaat alle mogelijkheden in de mediabeschrijvingen van het profiel ondersteunt. Dit elimineert de noodzaak van een evaluatie- en foutbenadering om te bepalen welke combinaties van mogelijkheden op een bepaald apparaat worden ondersteund.

Een camera zoeken die cameraprofielen ondersteunt

Als u cameraprofielen wilt gebruiken, moet u eerst controleren op een cameraapparaat dat het gebruik van cameraprofielen ondersteunt. In het onderstaande voorbeeld ziet u hoe u de methode DeviceInformation.FindAllAsync gebruikt om een lijst op te halen met alle beschikbare videoopnameapparaten op het voor- of achterpaneel van het huidige apparaat. Het doorloopt alle apparaten in de lijst door de statische methode IsVideoProfileSupportedaan te roepen voor elk apparaat om te zien of het videoprofielen ondersteunt.

Als een apparaat dat cameraprofielen ondersteunt in het gespecificeerde deelvenster wordt gevonden, wordt de waarde Id, die de ID-tekenreeks van het apparaat bevat, geretourneerd.

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;
}

Als de apparaat-id die door de GetVideoProfileSupportedDeviceIdAsync helpermethode wordt geretourneerd nul is of een lege tekenreeks, is er geen apparaat op het opgegeven paneel dat cameraprofielen ondersteunt. In dit geval moet u uw apparaat voor media-opname initialiseren zonder profielen te gebruiken.

string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);

if (string.IsNullOrEmpty(videoDeviceId))
{
    // No devices on the specified panel support video profiles. .
    return;
}

Selecteer een profiel op basis van ondersteunde resolutie en framesnelheid

Als u een profiel met bepaalde mogelijkheden wilt selecteren, zoals de mogelijkheid om een bepaalde resolutie en framesnelheid te bereiken, gebruikt u de methode die eerder in dit artikel wordt weergegeven om de id op te halen van een opnameapparaat dat ondersteuning biedt voor het gebruik van cameraprofielen.

Maak een nieuw MediaCaptureInitializationSettings object, waarbij de geselecteerde apparaat-id wordt doorgegeven. Roep de statische methode MediaCapture.FindAllVideoProfiles aan om een lijst op te halen met alle cameraprofielen die door het apparaat worden ondersteund.

In dit voorbeeld wordt een profiel geselecteerd dat een SupportedRecordMediaDescription object bevat waarin de eigenschappen Width, Heighten FrameRate overeenkomen met de aangevraagde waarden. Als er een overeenkomst wordt gevonden, worden VideoProfile en RecordMediaDescription van de MediaCaptureInitializationSettings ingesteld op de waarden die door de query worden geretourneerd. Als er geen overeenkomst wordt gevonden, wordt het standaardprofiel gebruikt.

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];
}

Nadat u de MediaCaptureInitializationSettings hebt ingevuld met het gewenste cameraprofiel, roept u gewoon InitializeAsync- aan op uw media capture-object om het te configureren voor het gewenste profiel.

await m_mediaCapture.InitializeAsync(mediaInitSettings);

Apparaten selecteren met KnownVideoProfile

U kunt de MediaFrameSourceGroup klasse gebruiken om cameraprofielen met specifieke mogelijkheden op te halen voordat u het MediaCapture--object initialiseert. Met framebrongroepen kunnen apparaatfabrikanten groepen sensoren vertegenwoordigen of mogelijkheden vastleggen als één virtueel apparaat. Dit maakt rekenkundige fotografiescenario's mogelijk, zoals het gebruik van diepte- en kleurcamera's, maar kan ook worden gebruikt om cameraprofielen te selecteren voor eenvoudige opnamescenario's. Voor meer informatie over het gebruik van MediaFrameSourceGroup, zie Process media-frames met MediaFrameReader.

In het onderstaande voorbeeld ziet u hoe u MediaFrameSourceGroup gebruikt om een cameraprofiel te vinden dat ondersteuning biedt voor het gewenste scenario. Roep MediaFrameSourceGroup.FindAllAsync aan om een lijst op te halen met alle mediaframebrongroepen die beschikbaar zijn op het huidige apparaat. Loop door elke brongroep en roep MediaCapture.FindKnownVideoProfiles om een lijst op te halen van alle videoprofielen voor de huidige brongroep die ondersteuning bieden voor de opgegeven KnownCameraProfile, in dit voorbeeld wordt de waarde KnownVideoProfile.HighQualityPhoto gebruikt. Andere waarden zijn bijvoorbeeld ondersteuning voor HDR en variabele fotoreeksen. Als een profiel dat voldoet aan de aangevraagde criteria wordt gevonden, maakt u een nieuw MediaCaptureInitializationSettings object en stelt u de VideoProfile- in op het geselecteerde profiel en de VideoDeviceId- op de eigenschap Id van de huidige mediaframebrongroep. Gebruik dit MediaCaptureInitializationSettings object om het MediaCapture--object te initialiseren.

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;
    }
}

Bepalen of een apparaat gelijktijdige foto- en videoopname ondersteunt

Veel apparaten ondersteunen het tegelijkertijd vastleggen van foto's en video's. Als u wilt bepalen of een opnameapparaat dit ondersteunt, roept u MediaCapture.FindAllVideoProfiles aan om alle cameraprofielen op te halen die door het apparaat worden ondersteund. Gebruik een koppelingsquery om een profiel te zoeken met ten minste één vermelding voor zowel SupportedPhotoMediaDescription als SupportedRecordMediaDescription wat betekent dat het profiel gelijktijdige opname ondersteunt.


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;
}

U kunt deze query verfijnen om te zoeken naar profielen die specifieke resoluties of andere mogelijkheden kunnen ondersteunen, naast gelijktijdige video-opnames. U kunt ook de MediaCapture.FindKnownVideoProfiles gebruiken en de waarde BalancedVideoAndPhoto opgeven om profielen op te halen die ondersteuning bieden voor gelijktijdige opname, maar het uitvoeren van query's op alle profielen levert volledigere resultaten op.