Запрос кодеков, установленных на устройстве

Класс CodecQuery позволяет запрашивать кодеки, установленные на текущем устройстве. Список кодеков, включенных в Windows для различных семейств устройств, приведен в статье Supported codecs, но так как пользователи и приложения могут устанавливать дополнительные кодеки на устройстве, может потребоваться запросить поддержку кодека во время выполнения, чтобы определить, какие кодеки доступны на текущем устройстве.

Инициализация нового экземпляра класса CodecQuery путем вызова конструктора.

var codecQuery = new CodecQuery();

Метод FindAllAsync возвращает все установленные кодеки, соответствующие заданным параметрам. Эти параметры включают значение CodecKind , указывающее, запрашиваете ли вы аудио или видеокодеки или оба, значение CodecCategory , указывающее, запрашиваете ли кодировщики или декодеры, а также строку, представляющую подтип кодирования мультимедиа, для которого запрашиваются запросы, например видео H.264 или аудио MP3.

Укажите пустую строку для значения подтипа, чтобы возвращать кодеки для всех подтипов. В следующем примере перечислены все кодировщики видео, установленные на устройстве.

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

Строка подтипа, передаваемая в FindAllAsync , может быть строковым представлением GUID подтипа, который определяется системой или кодом FOURCC для подтипа. Набор поддерживаемых GUID подтипов мультимедиа перечислен в статьях Audio Subtype GUIDs и Video Subtype GUIDs, но класс CodecSubtypes предоставляет свойства, которые возвращают значения GUID для каждого поддерживаемого подтипа. Дополнительные сведения о кодах FOURCC см. в разделе "Коды FOURCC".

В следующем примере указывается код FOURCC "H264" для определения наличия декодера видео H.264, установленного на устройстве. Этот запрос можно выполнить перед попыткой воспроизведения видеоконтента H.264. Вы также можете обрабатывать неподдерживаемые кодеки во время воспроизведения. Дополнительные сведения см. в разделе "Обработка неподдерживаемых кодеков и неизвестных ошибок при открытии элементов мультимедиа".

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

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

В следующем примере используются запросы, позволяющие определить, установлен ли на текущем устройстве кодировщик аудио FLAC, и, если он установлен, для этого подтипа создается MediaEncodingProfile, который можно использовать для записи звука в файл или для перекодирования звука из другого формата в аудиофайл 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;
}