Freigeben über


Abfrage nach Codecs, die auf einem Gerät installiert sind

Mit der CodecQuery-Klasse können Sie codecs abfragen, die auf dem aktuellen Gerät installiert sind. Die Liste der Codecs, die in Windows 10 für verschiedene Gerätefamilien enthalten sind, sind im Artikel "Unterstützte Codecs" aufgeführt. Da Benutzer und Apps jedoch zusätzliche Codecs auf einem Gerät installieren können, sollten Sie zur Laufzeit nach Codecunterstützung abfragen, um zu ermitteln, welche Codecs auf dem aktuellen Gerät verfügbar sind.

Die CodecQuery-API ist ein Mitglied des Windows.Media.Core-Namespace , daher müssen Sie diesen Namespace in Ihre App einschließen.

using Windows.Media.Core;

Initialisieren Sie eine neue Instanz der CodecQuery-Klasse , indem Sie den Konstruktor aufrufen.

var codecQuery = new CodecQuery();

Die FindAllAsync-Methode gibt alle installierten Codecs zurück, die den angegebenen Parametern entsprechen. Zu diesen Parametern gehören ein CodecKind-Wert, der angibt, ob Sie audio- oder videocodecs oder beide abfragen, einen CodecCategory-Wert, der angibt, ob Sie Encoder oder Decoder abfragen, und eine Zeichenfolge, die den Mediencodierungsuntertyp darstellt, für den Sie abfragen, z. B. H.264-Video oder MP3-Audio.

Geben Sie leere Zeichenfolge für den Untertypwert an, um Codecs für alle Untertypen zurückzugeben. Im folgenden Beispiel werden alle auf dem Gerät installierten Video-Encoder aufgelistet.

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

Die untertypzeichenfolge, die Sie an FindAllAsync übergeben, kann entweder eine Zeichenfolgendarstellung der untertyp-GUID sein, die vom System definiert wird, oder ein FOURCC-Code für den Untertyp. Die gruppe der unterstützten Medienuntertyp-GUIDs wird in den Artikeln AudioUntertyp-GUIDs und Videountertyp-GUIDs aufgeführt, aber die CodecSubtypes-Klasse stellt Eigenschaften bereit, die die GUID-Werte für jeden unterstützten Untertyp zurückgeben. Weitere Informationen zu FOURCC-Codes finden Sie unter FOURCC-Codes

Im folgenden Beispiel wird der FOURCC-Code "H264" angegeben, um festzustellen, ob auf dem Gerät ein H.264-Videodecoder installiert ist. Sie können diese Abfrage ausführen, bevor Sie versuchen, H.264-Videoinhalte wiederzugeben. Sie können auch nicht unterstützte Codecs zur Wiedergabezeit behandeln. Weitere Informationen finden Sie unter Behandeln nicht unterstützter Codecs und unbekannter Fehler beim Öffnen von Medienelementen.

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

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

Im folgenden Beispiel wird ermittelt, ob ein FLAC-Audio-Encoder auf dem aktuellen Gerät installiert ist, und wenn ja, wird ein MediaEncodingProfile für den Untertyp erstellt, der zum Aufzeichnen von Audio in eine Datei oder das Transcodierung von Audio aus einem anderen Format in eine FLAC-Audiodatei verwendet werden kann.

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