Partilhar via


Consultar 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 está listada no artigo Codecs com suporte, mas como os usuários e aplicativos podem instalar codecs adicionais em um dispositivo, talvez você queira consultar o suporte a codecs em runtime para determinar quais codecs estão disponíveis no dispositivo atual.

A API CodecQuery é 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 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 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 para 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 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 está 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 de GUID para cada subtipo com suporte. Para obter mais informações sobre códigos FOURCC, consulte 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ê pode executar essa consulta antes de tentar reproduzir o conteúdo de vídeo H.264. Você também pode lidar com codecs não suportados no momento da reprodução. Para obter mais informações, consulte Lidar com 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)
{
    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, em caso afirmativo, 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;
}