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

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

API CodecQuery является членом пространства имен Windows.Media.Core , поэтому необходимо включить это пространство имен в приложение.

using Windows.Media.Core;

Инициализируйте новый экземпляр класса 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)
{
    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);
    }
}

Строка подтипа, которая передается в FindAllAsync, может быть строковым представлением подтипа GUID, которое определяется системой, или кодом FOURCC для подтипа. Набор GUID подтипов поддерживаемых файлов мультимедиа перечислен в статьях GUID подтипа аудио и GUID подтипа видео, но класс 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)
{
    this.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;
}