Condividi tramite


Individuare e selezionare le funzionalità della fotocamera con i profili fotocamera in un'app WinUI 3

Questo articolo illustra come usare i profili fotocamera per individuare e gestire le funzionalità di diversi dispositivi di acquisizione video. Sono incluse attività come la selezione di profili che supportano risoluzioni o frequenze di fotogrammi specifiche, profili che supportano l'accesso simultaneo a più fotocamere e profili che supportano HDR.

Informazioni sui profili della fotocamera

Le fotocamere su dispositivi diversi supportano diverse funzionalità, tra cui il set di risoluzioni di acquisizione supportate, la frequenza dei fotogrammi per le acquisizioni video e se sono supportate acquisizioni HDR o a frequenza di fotogrammi variabile. Un set di funzionalità supportate viene definito in un oggetto MediaCaptureVideoProfileMediaDescription. Un profilo fotocamera, rappresentato da un oggetto MediaCaptureVideoProfile, include tre raccolte di descrizioni multimediali; uno per l'acquisizione di foto, uno per l'acquisizione video e un altro per l'anteprima video.

Prima di inizializzare il oggetto MediaCapture, è possibile interrogare i dispositivi di acquisizione sul dispositivo corrente per vedere quali profili sono supportati. Quando si seleziona un profilo supportato, si sa che il dispositivo di acquisizione supporta tutte le funzionalità nelle descrizioni multimediali del profilo. Ciò elimina la necessità di un approccio di valutazione ed errore per determinare quali combinazioni di funzionalità sono supportate in un determinato dispositivo.

Trovare una fotocamera che supporta i profili della fotocamera

Per usare i profili della fotocamera, è prima necessario verificare la presenza di un dispositivo fotocamera che supporti l'uso dei profili della fotocamera. L'esempio seguente mostra come usare il metodo deviceInformation.FindAllAsync per recuperare un elenco di tutti i dispositivi di acquisizione video disponibili nel pannello anteriore o posteriore del dispositivo corrente. Cicla attraverso tutti i dispositivi nell'elenco, chiamando il metodo statico IsVideoProfileSupportedper ogni dispositivo per verificare se supporta i profili video.

Se nel pannello specificato viene trovato un dispositivo che supporta i profili della fotocamera, viene restituito il valore ID, contenente la stringa ID 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;
}

Se l'ID dispositivo restituito dal metodo helper GetVideoProfileSupportedDeviceIdAsync è nullo o una stringa vuota, non c'è nessun dispositivo sul pannello specificato che supporti i profili della fotocamera. In questo caso, è necessario inizializzare il dispositivo di acquisizione multimediale senza usare i profili.

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

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

Selezionare un profilo in base alla risoluzione supportata e alla frequenza dei fotogrammi

Per selezionare un profilo con funzionalità specifiche, ad esempio con la possibilità di ottenere una risoluzione e una frequenza dei fotogrammi specifica, usare il metodo illustrato in precedenza in questo articolo per ottenere l'ID di un dispositivo di acquisizione che supporta l'uso dei profili della fotocamera.

Creare un nuovo oggetto MediaCaptureInitializationSettings, fornendo l'ID del dispositivo selezionato. Chiamare il metodo statico MediaCapture.FindAllVideoProfiles per ottenere un elenco di tutti i profili della fotocamera supportati dal dispositivo.

Questo esempio seleziona un profilo contenente un oggetto SupportedRecordMediaDescription in cui le proprietà Larghezza, Altezzae FrequenzaFotogrammi corrispondono ai valori richiesti. Se viene trovata una corrispondenza, VideoProfile e RecordMediaDescription del MediaCaptureInitializationSettings vengono impostati sui valori restituiti dalla query. Se non viene trovata alcuna corrispondenza, viene usato il profilo predefinito.

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

Dopo aver popolato il MediaCaptureInitializationSettings con il profilo della fotocamera desiderato, è sufficiente chiamare InitializeAsync sull'oggetto acquisizione multimediale per configurarlo nel profilo desiderato.

await m_mediaCapture.InitializeAsync(mediaInitSettings);

Selezionare i dispositivi con KnownVideoProfile

Puoi usare la classe MediaFrameSourceGroup per ottenere profili di fotocamera con funzionalità specifiche prima di inizializzare l'oggetto MediaCapture. I gruppi di origine dei frame consentono ai produttori di dispositivi di rappresentare gruppi di sensori o funzionalità di acquisizione come un singolo dispositivo virtuale. Ciò consente scenari di fotografia computazionali come l'uso di fotocamere di profondità e colori insieme, ma può anche essere usato per selezionare i profili della fotocamera per scenari di acquisizione semplici. Per altre informazioni sull'uso di MediaFrameSourceGroup, vedere Elaborare fotogrammi multimediali con MediaFrameReader.

L'esempio seguente illustra come usare MediaFrameSourceGroup per trovare un profilo della fotocamera che supporta lo scenario desiderato. Chiamare MediaFrameSourceGroup.FindAllAsync per ottenere un elenco di tutti i gruppi di origine dei fotogrammi multimediali disponibili nel dispositivo corrente. Scorrere ogni gruppo di origine e chiamare MediaCapture.FindKnownVideoProfiles per ottenere un elenco di tutti i profili video per il gruppo di origine corrente che supporta il KnownCameraProfile specificato, in questo esempio viene usato il valore KnownVideoProfile.HighQualityPhoto. Altri valori includono ad esempio il supporto per le sequenze di foto HDR e variabili. Se viene trovato un profilo che soddisfa i criteri richiesti, creare un nuovo oggetto MediaCaptureInitializationSettings e impostare il VideoProfile sul profilo selezionato e il VideoDeviceId sulla proprietà Id del gruppo di origine dei fotogrammi multimediali corrente. Utilizzare questo oggetto MediaCaptureInitializationSettings per inizializzare l'oggetto 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;
    }
}

Determinare se un dispositivo supporta l'acquisizione simultanea di foto e video

Molti dispositivi supportano l'acquisizione simultanea di foto e video. Per determinare se un dispositivo di acquisizione supporta questa funzionalità, chiamare MediaCapture.FindAllVideoProfiles per ottenere tutti i profili della fotocamera supportati dal dispositivo. Usare una query di collegamento per trovare un profilo con almeno una voce per SupportedPhotoMediaDescription e SupportedRecordMediaDescription, ciò significa che il profilo supporta l'acquisizione simultanea.


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

È possibile perfezionare questa query per cercare i profili che supportano risoluzioni specifiche o altre funzionalità oltre al record video simultaneo. È anche possibile usare il MediaCapture.FindKnownVideoProfiles e specificare il valore BalancedVideoAndPhoto per recuperare i profili che supportano l'acquisizione simultanea, ma l'esecuzione di query su tutti i profili fornirà risultati più completi.