Partager via


Rechercher les codecs installés sur un appareil

La classe CodecQuery vous permet d’interroger les codecs installés sur l’appareil actuel. La liste des codecs inclus dans Windows 10 pour différentes familles d’appareils est répertoriée dans l’article Codecs pris en charge, mais étant donné que les utilisateurs et les applications peuvent installer des codecs supplémentaires sur un appareil, vous pouvez demander la prise en charge des codecs au moment de l’exécution pour déterminer quels codecs sont disponibles sur l’appareil actuel.

L’API CodecQuery est membre de l’espace de noms Windows.Media.Core . Vous devez donc inclure cet espace de noms dans votre application.

using Windows.Media.Core;

Initialisez une nouvelle instance de la classe CodecQuery en appelant le constructeur.

var codecQuery = new CodecQuery();

La méthode FindAllAsync retourne tous les codecs installés qui correspondent aux paramètres fournis. Ces paramètres incluent une valeur CodecKind spécifiant si vous interrogez des codecs audio ou vidéo ou les deux, une valeur CodecCategory spécifiant si vous interrogez des encodeurs ou des décodeurs, et une chaîne qui représente le sous-type d’encodage multimédia pour lequel vous interrogez, comme la vidéo H.264 ou l’audio MP3.

Spécifiez une chaîne vide pour la valeur de sous-type pour retourner des codecs pour tous les sous-types. L’exemple suivant répertorie tous les encodeurs vidéo installés sur l’appareil.

IReadOnlyList<CodecInfo> result =
    await codecQuery.FindAllAsync(CodecKind.Video, CodecCategory.Encoder, "");

foreach (var codecInfo in result)
{
    this.codecResultsTextBox.Text += "============================================================\n";
    this.codecResultsTextBox.Text += string.Format("Codec: {0}\n", codecInfo.DisplayName);
    this.codecResultsTextBox.Text += string.Format("Kind: {0}\n", codecInfo.Kind.ToString());
    this.codecResultsTextBox.Text += string.Format("Category: {0}\n", codecInfo.Category.ToString());
    this.codecResultsTextBox.Text += string.Format("Trusted: {0}\n", codecInfo.IsTrusted.ToString());

    foreach (string subType in codecInfo.Subtypes)
    {
        this.codecResultsTextBox.Text += string.Format("   Subtype: {0}\n", subType);
    }
}

La chaîne de sous-type que vous passez dans FindAllAsync peut être une représentation sous-type du GUID de sous-type qui est définie par le système ou un code FOURCC pour le sous-type. L’ensemble des GUID de sous-type multimédia pris en charge sont répertoriés dans les articles GUID de sous-type Audio et GUID de sous-type vidéo, mais la classe CodecSubtypes fournit des propriétés qui retournent les valeurs GUID pour chaque sous-type pris en charge. Pour plus d’informations sur les codes FOURCC, consultez Codes FOURCC

L’exemple suivant spécifie le code FOURCC « H264 » pour déterminer s’il existe un décodeur vidéo H.264 installé sur l’appareil. Vous pouvez effectuer cette requête avant de tenter de lire le contenu vidéo H.264. Vous pouvez également gérer des codecs non pris en charge au moment de la lecture. Pour plus d’informations, consultez Gérer les codecs non pris en charge et les erreurs inconnues lors de l’ouverture d’éléments multimédias.

IReadOnlyList<CodecInfo> h264Result = await codecQuery.FindAllAsync(CodecKind.Video, CodecCategory.Decoder, "H264");

if (h264Result.Count > 0)
{
    this.codecResultsTextBox.Text = "H264 decoder is present.";
}

L’exemple de requête suivant permet de déterminer si un encodeur audio CSV est installé sur l’appareil actuel et, le cas échéant, un MediaEncodingProfile est créé pour le sous-type qui peut être utilisé pour capturer l’audio dans un fichier ou transcoder l’audio d’un autre format vers un fichier audio DOCKER.

IReadOnlyList<CodecInfo> flacResult = 
    await codecQuery.FindAllAsync(CodecKind.Audio, CodecCategory.Encoder, CodecSubtypes.AudioFormatFlac);

if (flacResult.Count > 0)
{
    AudioEncodingProperties audioProps = new AudioEncodingProperties();
    audioProps.Subtype = CodecSubtypes.AudioFormatFlac;
    audioProps.SampleRate = 44100;
    audioProps.ChannelCount = 2;
    audioProps.Bitrate = 128000;
    audioProps.BitsPerSample = 32;

    MediaEncodingProfile encodingProfile = new MediaEncodingProfile();
    encodingProfile.Audio = audioProps;
    encodingProfile.Video = null;
}