Consulta para codecs instalados em um dispositivo

A classe CodecQuery permite que você consulte codecs instalados no dispositivo atual. A lista de codecs incluídos com Windows para diferentes famílias de dispositivos está listada no artigo Supported codecs, mas como usuários e aplicativos podem instalar codecs adicionais em um dispositivo, convém consultar o suporte do codec em runtime para determinar quais codecs estão disponíveis no dispositivo atual.

Inicialize uma nova instância da classe CodecQuery chamando o construtor.

var codecQuery = new CodecQuery();

O método FindAllAsync retorna todos os codecs instalados que correspondem aos parâmetros fornecidos. Esses parâmetros incluem um valor CodecKind que especifica se você está consultando codecs de áudio ou vídeo ou ambos, um valor CodecCategory que especifica se você está consultando codificadores ou decodificadores e uma cadeia de caracteres que representa o subtipo de codificação de mídia para o qual você está consultando, como vídeo H.264 ou áudio MP3.

Especifique uma string vazia como valor do subtipo para retornar codecs de todos os subtipos. O exemplo a seguir lista todos os codificadores de vídeo instalados no dispositivo.

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

A cadeia de caracteres de subtipo que você passa para FindAllAsync pode ser uma representação de cadeia de caracteres do GUID do subtipo que é definido pelo sistema ou um código FOURCC para o subtipo. O conjunto de GUIDs de subtipo de mídia com suporte é listado nos artigos GUIDs de Subtipo de Áudio e GUIDs de Subtipo de Vídeo, mas a classe CodecSubtypes fornece propriedades que retornam os valores guid para cada subtipo com suporte. Para obter mais informações sobre códigos FOURCC, consulte FOURCC Codes.

O exemplo a seguir especifica o código FOURCC "H264" para determinar se há um decodificador de vídeo H.264 instalado no dispositivo. Você pode executar essa consulta antes de tentar reproduzir o conteúdo do vídeo H.264. Você também pode lidar com codecs sem suporte no tempo de reprodução. Para obter mais informações, consulte Manipular codecs sem suporte e erros desconhecidos ao abrir itens de mídia.

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

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

O exemplo a seguir consulta para determinar se um codificador de áudio FLAC está instalado no dispositivo atual e, se sim, um MediaEncodingProfile é criado para o subtipo que pode ser usado para capturar áudio em um arquivo ou transcodificar áudio de outro formato para um arquivo de áudio 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;
}