Wykonywanie zapytań dotyczących koderów zainstalowanych na urządzeniu

Klasa CodecQuery umożliwia wykonywanie zapytań dotyczących koderów zainstalowanych na bieżącym urządzeniu. Lista koderów dołączonych do Windows dla różnych rodzin urządzeń znajduje się na liście w artykule Supported codecs ale ponieważ użytkownicy i aplikacje mogą instalować dodatkowe koderki na urządzeniu, możesz chcieć wykonać zapytanie o obsługę koderaków w czasie wykonywania, aby określić, jakie kodery są dostępne na bieżącym urządzeniu.

Zainicjuj nowe wystąpienie klasy CodecQuery przez wywołanie konstruktora.

var codecQuery = new CodecQuery();

Metoda FindAllAsync zwraca wszystkie zainstalowane kodery-dekodery zgodne z podanymi parametrami. Te parametry obejmują wartość CodecKind określającą, czy wykonujesz zapytania dotyczące koderów audio, wideo, czy obu, wartość CodecCategory określająca, czy wykonujesz zapytania dotyczące koderów lub dekodatorów, oraz ciąg reprezentujący podtyp kodowania multimediów, dla którego wykonujesz zapytania, takie jak wideo H.264 lub audio MP3.

Określ pusty ciąg jako wartość podtypu, aby zwrócić kodeki dla wszystkich podtypów. Poniższy przykład zawiera listę wszystkich koderów wideo zainstalowanych na urządzeniu.

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

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

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

Ciąg znaków podtypu przekazywany do FindAllAsync może być albo ciągową reprezentacją identyfikatora GUID podtypu zdefiniowanego przez system, albo kodem FOURCC dla podtypu. Zestaw obsługiwanych identyfikatorów GUID podtypu multimediów znajduje się w artykułach Identyfikatory GUID podtypu audio i identyfikatory GUID podtypuwideo, ale klasa CodecSubtypes zawiera właściwości, które zwracają wartości identyfikatora GUID dla każdego obsługiwanego podtypu. Aby uzyskać więcej informacji na temat kodów FOURCC, zobacz FOURCC Codes (Kody FOURCC).

W poniższym przykładzie określono kod FOURCC "H264", aby określić, czy na urządzeniu jest zainstalowany dekoder wideo H.264. To zapytanie można wykonać przed próbą odtworzenia zawartości wideo H.264. W czasie odtwarzania można również obsługiwać nieobsługiwane kodeczki. Aby uzyskać więcej informacji, zobacz Handle unsupported codecs and unknown errors when opening media items (Obsługa nieobsługiwanych koderów i nieznanych błędów podczas otwierania elementów multimedialnych).

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

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

Poniższe przykładowe zapytania określają, czy koder audio FLAC jest zainstalowany na bieżącym urządzeniu, a jeśli tak, MediaEncodingProfile jest tworzony dla podtypu, który może służyć do przechwytywania dźwięku do pliku lub transkodowania audio z innego formatu do pliku audio FLAC.

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