Condividi tramite


Eseguire una query per i codec installati in un dispositivo

La classe CodecQuery consente di eseguire query per i codec installati nel dispositivo corrente. L'elenco dei codec inclusi in Windows 10 per famiglie di dispositivi diverse è elencato nell'articolo Codec supportati, ma poiché gli utenti e le app possono installare codec aggiuntivi in un dispositivo, è possibile eseguire una query per il supporto dei codec in fase di esecuzione per determinare quali codec sono disponibili nel dispositivo corrente.

L'API CodecQuery è un membro dello spazio dei nomi Windows.Media.Core, quindi lo si dovrà includere questo spazio dei nomi nell'app.

using Windows.Media.Core;

Inizializzare una nuova istanza della classe CodecQuery chiamando il costruttore .

var codecQuery = new CodecQuery();

Il metodo FindAllAsync restituisce tutti i codec installati che corrispondono ai parametri specificati. Questi parametri includono un valore CodecKind che specifica se si esegue una query per codec audio o video o entrambi, un CodecCategory che specifica se si esegue una query per codificatori o decodificatori e una stringa che rappresenta il sottotipo di codifica multimediale per cui si esegue una query, ad esempio video H.264 o audio MP3.

Specificare una stringa vuota per il valore del sottotipo per restituire codec per tutti i sottotipi. L'esempio seguente elenca tutti i codificatori video installati nel 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 stringa del sottotipo passata in FindAllAsync può essere una rappresentazione di stringa del GUID del sottotipo definito dal sistema o da un codice FOURCC per il sottotipo. Il set di GUID del sottotipo multimediale supportato è elencato negli articoli Audio Subtype GUID e Video Subtype GUID, ma il CodecSubtypes fornisce proprietà che restituiscono i valori GUID per ogni sottotipo supportato. Per altre informazioni sui codici FOURCC, vedere codici FOURCC

Nell'esempio seguente viene specificato il codice FOURCC "H264" per determinare se nel dispositivo è installato un decodificatore video H.264. È possibile eseguire questa query prima di tentare di riprodurre contenuto video H.264. Si possono anche gestire codec non supportati in fase di riproduzione. Per altre informazioni, vedere Gestire codec non supportati ed errori sconosciuti durante l'apertura di elementi multimediali.

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

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

Nell'esempio seguente viene eseguita una query per determinare se nel dispositivo corrente è installato un codificatore audio FLAC e, in tal caso, viene creato un MediaEncodingProfile per il sottotipo che può essere usato per acquisire l'audio in un file o transcodificare l'audio da un altro formato a un file 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;
}