Consulta de códecs instalados en un dispositivo

La clase CodecQuery permite consultar los códecs instalados en el dispositivo actual. La lista de códecs que se incluyen con Windows 10 para diferentes familias de dispositivos se muestra en el artículo Códecs admitidos, pero dado que los usuarios y las aplicaciones pueden instalar códecs adicionales en un dispositivo, es posible que quiera consultar la compatibilidad con códecs en tiempo de ejecución para determinar qué códecs están disponibles en el dispositivo actual.

CodecQuery API es miembro del espacio de nombres Windows.Media.Core , por lo que deberá incluir este espacio de nombres en la aplicación.

using Windows.Media.Core;

Inicialice una nueva instancia de la clase CodecQuery llamando al constructor .

var codecQuery = new CodecQuery();

El método FindAllAsync devuelve todos los códecs instalados que coinciden con los parámetros proporcionados. Estos parámetros incluyen un valor CodecKind que especifica si está consultando códecs de audio o vídeo o ambos, un valor CodecCategory que especifica si está consultando para codificadores o descodificadores, y una cadena que representa el subtipo de codificación multimedia para el que está consultando, como el audio H.264 o MP3.

Especifique una cadena vacía para el valor del subtipo para devolver códecs para todos los subtipos. En el ejemplo siguiente se enumeran todos los codificadores de vídeo instalados en el 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);
    }
}

La cadena de subtipo que se pasa a FindAllAsync puede ser una representación de cadena del GUID del subtipo definido por el sistema o un código FOURCC para el subtipo. El conjunto de GUID de subtipo de medios admitidos se enumeran en los artículos GUID de subtipo de audio y GUID de subtipo de vídeo, pero la clase CodecSubtypes proporciona propiedades que devuelven los valores GUID de cada subtipo admitido. Para obtener más información sobre los códigos FOURCC, consulte Códigos FOURCC.

En el ejemplo siguiente se especifica el código FOURCC "H264" para determinar si hay un descodificador de vídeo H.264 instalado en el dispositivo. Puede realizar esta consulta antes de intentar reproducir contenido de vídeo H.264. También puede controlar los códecs no admitidos en tiempo de reproducción. Para obtener más información, vea Controlar códecs no admitidos y errores desconocidos al abrir elementos multimedia.

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

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

En el ejemplo siguiente se consulta para determinar si se instala un codificador de audio FLAC en el dispositivo actual y, si es así, se crea un mediaEncodingProfile para el subtipo que se podría usar para capturar audio en un archivo o transcodificación de audio de otro formato a un archivo de audio 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;
}