Détecter et sélectionner des fonctions de l’appareil photo à l’aide de profils d’appareil photo

Cet article explique comment utiliser des profils d’appareil photo pour découvrir et gérer les fonctionnalités de différents appareils de capture vidéo. Cela inclut des tâches telles que la sélection de profils qui prennent en charge des résolutions ou des fréquences d’images spécifiques, des profils qui prennent en charge l’accès simultané à plusieurs appareils photo et des profils qui prennent en charge la HDR.

Note

Cet article repose sur les concepts et le code décrits dans Capture photo, vidéo et audio de base à l’aide de MediaCapture, qui décrit comment implémenter la capture photo et vidéo de base. Il est recommandé de vous familiariser avec le modèle de capture multimédia de base dans cet article avant de passer à des scénarios de capture plus avancés. Le code de cet article suppose que votre application a déjà une instance de MediaCapture qui a été correctement initialisée.

 

À propos des profils d’appareil photo

Les appareils photo sur différents appareils prennent en charge différentes fonctionnalités, notamment l’ensemble des résolutions de capture prises en charge, la fréquence d’images pour les captures vidéo et la prise en charge des captures HDR ou à fréquence d’images variable. L’infrastructure de capture multimédia de plateforme Windows universelle (UWP) stocke cet ensemble de fonctionnalités dans un objet MediaCaptureVideoProfileMediaDescription. Un profil d’appareil photo, représenté par un objet MediaCaptureVideoProfile, possède trois collections de descriptions multimédias : une pour la capture de photos, une pour la capture vidéo et une autre pour la prévisualisation vidéo.

Avant d’initialiser votre objet MediaCapture, vous pouvez interroger les appareils de capture sur l’appareil actuel pour voir quels profils sont pris en charge. Lorsque vous sélectionnez un profil pris en charge, vous savez que l’appareil de capture prend en charge toutes les fonctionnalités des descriptions multimédias du profil. Cela élimine la nécessité d’une approche par essais et erreurs pour déterminer quelles combinaisons de fonctionnalités sont prises en charge sur un appareil particulier.

var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };

Les exemples de code de cet article remplacent cette initialisation minimale par la découverte des profils d’appareil photo prenant en charge différentes fonctionnalités, qui sont ensuite utilisés pour initialiser l’appareil de capture multimédia.

Rechercher un appareil vidéo prenant en charge des profils d’appareil photo

Avant de rechercher des profils d’appareil photo pris en charge, vous devez trouver un appareil de capture qui prend en charge l’utilisation des profils d’appareil photo. La méthode d’assistance GetVideoProfileSupportedDeviceIdAsync définie dans l’exemple ci-dessous utilise la méthode DeviceInformaion.FindAllAsync pour récupérer la liste de tous les appareils de capture vidéo disponibles. Il passe en boucle sur tous les appareils de la liste, appelant la méthode statique IsVideoProfileSupported pour chaque appareil pour voir s’il prend en charge les profils vidéo. Par ailleurs, la propriété EnclosureLocation.Panel pour chaque appareil vous permet de spécifier si vous souhaitez une caméra à l'avant ou à l'arrière de l'appareil.

Si un appareil prenant en charge les profils d’appareil photo se trouve dans le panneau spécifié, la valeur ID contenant la chaîne d’ID de l’appareil est retournée.

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 l’ID d’appareil retourné à partir de la méthode d’assistance GetVideoProfileSupportedDeviceIdAsync est nul ou une chaîne vide, cela signifie qu’il n’existe aucun appareil dans le panneau spécifié qui prend en charge les profils d’appareil photo. Dans ce cas, vous devez initialiser votre appareil de capture multimédia sans utiliser de profils.

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

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

Sélectionner un profil en fonction de la résolution et de la fréquence d’images prises en charge

Pour sélectionner un profil avec des fonctionnalités particulières, par exemple avec la possibilité d’obtenir une résolution et une fréquence d’images particulières, vous devez d’abord appeler la méthode d’assistance définie ci-dessus pour obtenir l’ID d’un appareil de capture prenant en charge l’utilisation de profils d’appareil photo.

Créez un objet MediaCaptureInitializationSettings, en passant l’ID de l’appareil sélectionné. Ensuite, appelez la méthode statique MediaCapture.FindAllVideoProfiles pour obtenir la liste de tous les profils d’appareil photo pris en charge par l’appareil.

Cet exemple utilise une méthode de requête Linq, incluse dans l’espace de noms using System.Linq, pour sélectionner un profil qui contient un objet SupportedRecordMediaDescription où les propriétés Largeur, Hauteuret Fréquence d’images correspondent aux valeurs demandées. Si une correspondance est trouvée, les champs VideoProfile et RecordMediaDescription de l’objet MediaCaptureInitializationSettings sont définis sur les valeurs du type anonyme retourné par la requête Linq. Si aucune correspondance n’est trouvée, le profil par défaut est utilisé.


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

Une fois que vous avez rempli l’objet MediaCaptureInitializationSettings avec votre profil d’appareil photo souhaité, vous appelez simplement InitializeAsync sur votre objet de capture multimédia pour le configurer sur le profil souhaité.

await _mediaCapture.InitializeAsync(mediaInitSettings);

Utiliser des groupes de sources d’images multimédias pour obtenir des profils

À compter de Windows 10, version 1803, vous pouvez utiliser la classe MediaFrameSourceGroup pour obtenir des profils d’appareil photo avec des fonctionnalités spécifiques avant d’initialiser l’objet MediaCapture. Les groupes de sources d’images permettent aux fabricants d’appareils de représenter des groupes de capteurs ou de fonctionnalités de capture en tant qu’appareil virtuel unique. Cela permet des scénarios de photographie de calcul tels que l’utilisation d’appareils photo de profondeur et de couleurs ensemble, mais peut également être utilisé pour sélectionner des profils d’appareil photo pour des scénarios de capture simples. Pour plus d’informations sur l’utilisation de MediaFrameSourceGroup, consultez Traiter des images multimédias avec MediaFrameReader.

L’exemple de méthode ci-dessous montre comment utiliser des objets MediaFrameSourceGroup pour rechercher un profil d’appareil photo qui prend en charge un profil vidéo connu, tel que celui qui prend en charge la HDR ou la séquence de photos variables. Tout d’abord, appelez MediaFrameSourceGroup.FindAllAsync pour obtenir la liste de tous les groupes de sources d’images multimédias disponibles sur l’appareil actuel. Parcourez chaque groupe de sources et appelez MediaCapture.FindKnownVideoProfiles pour obtenir la liste de tous les profils vidéo du groupe de sources actuel qui prennent en charge le profil spécifié, dans ce cas HDR avec photo WCG. Si un profil répondant aux critères est trouvé, créez un objet MediaCaptureInitializationSettings et définissez VideoProfile sur le profil sélectionné et VideoDeviceId sur la propriété Id du groupe de sources d’images multimédias actuel. Par exemple, vous pouvez transmettre la valeur KnownVideoProfile.HdrWithWcgVideo dans cette méthode pour obtenir les paramètres de capture multimédia qui prennent en charge la vidéo HDR. Passez KnownVideoProfile.VariablePhotoSequence pour obtenir les paramètres qui prennent en charge la séquence de photos variables.

private async Task<MediaCaptureInitializationSettings> GetKnownVideoProfile(KnownVideoProfile knownVideoProfile)
{
    IReadOnlyList<MediaFrameSourceGroup> sourceGroups = await MediaFrameSourceGroup.FindAllAsync();
    MediaCaptureInitializationSettings settings = null;

    foreach (MediaFrameSourceGroup sg in sourceGroups)
    {
        // Find a device that support VariablePhotoSequence
        IReadOnlyList<MediaCaptureVideoProfile> profileList = MediaCapture.FindKnownVideoProfiles(
                                      sg.Id,
                                      knownVideoProfile); // e.g. KnownVideoProfile.HdrWithWcgVideo

        if (profileList.Count > 0)
        {
            settings = new MediaCaptureInitializationSettings();
            settings.VideoProfile = profileList[0];
            settings.VideoDeviceId = sg.Id;
            break;
        }
    }
    return settings;

    
}

Utiliser des profils connus pour rechercher un profil qui prend en charge la vidéo HDR (technique héritée)

Note

Les API décrites dans cette section sont déconseillées à partir de Windows 10, version 1803. Consultez la section précédente, Utiliser des groupes de sources d’images multimédias pour obtenir des profils.

La sélection d’un profil prenant en charge la HDR commence comme les autres scénarios. Créez un objet MediaCaptureInitializationSettings et une chaîne contenant l’ID de l’appareil de capture. Ajoutez une variable booléenne qui permet de suivre si la vidéo HDR est prise en charge.

MediaCaptureInitializationSettings mediaInitSettings = new MediaCaptureInitializationSettings();
string videoDeviceId = string.Empty;
bool HdrVideoSupported = false;

Utilisez la méthode d’assistance GetVideoProfileSupportedDeviceIdAsync définie ci-dessus pour obtenir l’ID de l’appareil pour un appareil de capture qui prend en charge les profils d’appareil photo.

// Select the first video capture device found on the back of the device
videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);

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

La méthode statique MediaCapture.FindKnownVideoProfiles renvoie les profils d’appareil photo pris en charge par l’appareil spécifié classé par la valeur KnownVideoProfile spécifiée. Pour ce scénario, la valeur VideoRecording est spécifiée pour limiter les profils d’appareil photo retournés à ceux qui prennent en charge l’enregistrement vidéo.

Parcourez la liste retournée des profils d’appareil photo. Pour chaque profil d’appareil photo, parcourez chaque VideoProfileMediaDescription dans le profil pour vérifier si la propriété IsHdrVideoSupported est définie sur true. Une fois qu’une description multimédia appropriée est trouvée, sortez de la boucle et affectez le profil et les objets de description à l’objet MediaCaptureInitializationSettings.

IReadOnlyList<MediaCaptureVideoProfile> profiles =
    MediaCapture.FindKnownVideoProfiles(videoDeviceId, KnownVideoProfile.VideoRecording);

// Walk through available profiles, look for first profile with HDR supported Video Profile
foreach (MediaCaptureVideoProfile profile in profiles)
{
    IReadOnlyList<MediaCaptureVideoProfileMediaDescription> recordMediaDescription =
        profile.SupportedRecordMediaDescription;
    foreach (MediaCaptureVideoProfileMediaDescription videoProfileMediaDescription in recordMediaDescription)
    {
        if (videoProfileMediaDescription.IsHdrVideoSupported)
        {
            // We've located the profile and description for HDR Video, set profile and flag
            mediaInitSettings.VideoProfile = profile;
            mediaInitSettings.RecordMediaDescription = videoProfileMediaDescription;
            HdrVideoSupported = true;
            break;
        }
    }

    if (HdrVideoSupported)
    {
        // Profile with HDR support found. Stop looking.
        break;
    }
}

Déterminer si un appareil prend en charge la capture vidéo et photo simultanées

De nombreux appareils prennent en charge la capture de photos et de vidéos simultanément. Pour déterminer si un appareil de capture prend cette fonctionnalité en charge, appelez MediaCapture.FindAllVideoProfiles pour obtenir tous les profils d’appareil photo pris en charge. Utilisez une requête de lien pour rechercher un profil qui a au moins une entrée pour SupportedPhotoMediaDescription et SupportedRecordMediaDescription, ce qui signifie que le profil prend en charge la capture simultanée.

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

Vous pouvez affiner cette requête pour rechercher des profils qui prennent en charge des résolutions spécifiques ou d’autres fonctionnalités en plus de l’enregistrement vidéo simultané. Vous pouvez également utiliser MediaCapture.FindKnownVideoProfiles et spécifier la valeur BalancedVideoAndPhoto pour récupérer les profils prenant en charge la capture simultanée, mais vous obtiendrez des résultats plus complets en interrogeant tous les profils.