UWP: Rechercher les codecs installés sur un appareil

In Mobile Development by Christian HissibiniLeave a Comment

La classe CodecQuery vous permet de rechercher les codecs installés sur l’appareil actuel. Les codecs qui sont fournis dans Windows10 pour les différentes familles d’appareils sont répertoriés dans l’article Codecs pris en charge; toutefois, étant donné que les utilisateurs et les applications peuvent installer des codecs supplémentaires sur un appareil, vous pouvez avoir besoin de rechercher les codecs pris en charge au moment de l’exécution afin de déterminer les codecs qui sont disponibles sur l’appareil actuel.

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

L’API CodecQuery est un membre de l’espace de noms Windows.Media.Core. Vous devrez donc inclure cet espace de noms dans votre application.C#Copier

using Windows.Media.Core;

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

var codecQuery = new CodecQuery();

La méthode FindAllAsync renvoie tous les codecs installés qui correspondent aux paramètres fournis. Ces paramètres comportent une valeur CodecKind indiquant si vous recherchez des codecs audio, vidéo ou les deux, une valeur CodecCategory précisant si vous recherchez des encodeurs ou des décodeurs, ainsi qu’une chaîne représentant le sous-type d’encodage multimédia sur lequel porte votre recherche, tel que vidéo H.264 ou audio MP3.

Pour rechercher les codecs correspondant à tous les sous-types, spécifiez une chaîne vide ou une valeur Null pour le sous-type.L’exemple ci-après répertorie tous les encodeurs vidéo installés sur l’appareil.C#Copier

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 transmettez dans FindAllAsync peut être une représentation de chaîne du GUID de sous-type défini par le système ou un code FOURCC relatif au sous-type. Les 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 renvoient les valeurs de GUID pour chaque sous-type pris en charge. Pour plus d’informations sur les codes FOURCC, consultez l’article Codes FOURCC.

L’exemple ci-après indique le code FOURCC «H264» pour déterminer si un décodeur vidéo H.264 est installé sur l’appareil. Vous pouvez exécuter cette requête avant d’essayer de lire du contenu vidéo H.264. Vous pouvez également gérer les codecs non pris en charge au moment de la lecture. Pour plus d’informations, consultez l’article Gérer les codecs non pris en charge et les erreurs inconnues à l’ouverture des éléments multimédias.C#Copier

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

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

L’exemple ci-après cherche à déterminer si un encodeur audio FLAC est installé sur l’appareil actuel. Si tel est le cas, un objet MediaEncodingProfile est créé pour le sous-type qui peut être utilisé pour la capture de contenu audio dans un fichier ou le transcodage du contenu audio d’un autre format vers un fichier audio FLAC.C#Copier

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

Leave a Comment