Consulta de codecs instalados em um dispositivo

A classe CodecQuery permite consultar codecs instalados no dispositivo atual. A lista de codecs incluídos no Windows 10 para diferentes famílias de dispositivos é mostrada no artigo Codecs compatíveis, mas já que os usuários e os aplicativos podem instalar codecs adicionais em um dispositivo, talvez você queira consultar o suporte ao codec em tempo de execução para determinar quais codecs estão disponíveis no dispositivo atual.

A API CodecQuery é um membro do namespace Windows.Media.Core , portanto, você precisará incluir esse namespace em seu aplicativo.

using Windows.Media.Core;

Inicialize uma nova instância da classe CodecQuery ao chamar 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 especificando se você está consultando codecs de áudio ou vídeo ou ambos, um valor CodecCategory especificando 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 a cadeia de caracteres vazia para o valor do subtipo retornar codecs para 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)
{
    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);
    }
}

A cadeia de caracteres de subtipo passada para FindAllAsync pode ser uma representação de cadeia de caracteres do GUID de subtipo, que é definido pelo sistema, ou um código FOURCC para o subtipo. O conjunto de GUIDs de subtitpo de mídia com suporte é mostrado nos artigos GUIDs de subtipo de áudio e GUIDs de subtipo de vídeo, mas a classe CodecSubtypes fornece propriedades que retornam os valores de GUID para cada tipo compatível. Para saber mais sobre códigos FOURCC, veja Códigos FOURCC

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ê também pode executar essa consulta antes de tentar reproduzir conteúdo de vídeo H.264. Você também pode manipular codecs sem suporte ao tempo de reprodução. Para saber mais, veja Manipular erros desconhecidos e de codecs sem suporte ao abrir itens de mídia.

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

if (h264Result.Count > 0)
{
    this.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, nesse caso, um MediaEncodingProfile é criado para o subtipo que pode ser usado para capturar áudio de um arquivo ou para 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;
}