デバイスにインストールされているコーデックの照会

CodecQuery クラスによって、現在のデバイスにインストールされているコーデックを照会できます。 Windows 10 に含まれているさまざまなデバイス ファミリのコーデックの一覧については、「サポートされるコーデック」の記事に示されています。ただし、ユーザーやアプリはデバイスに追加のコーデックをインストールできるため、現在のデバイスでどのようなコーデックが利用可能かを特定するために、実行時にコーデックのサポートを照会することができます。

CodecQuery API は、Windows.Media.Core 名前空間のメンバーであるため、この名前空間をアプリに含める必要があります。

using Windows.Media.Core;

コンストラクターを呼び出すことによって、CodecQuery クラスの新しいインスタンスを初期化します。

var codecQuery = new CodecQuery();

FindAllAsync メソッドは、指定されたパラメーターに一致するインストール済みのすべてのコーデックを返します。 これらのパラメーターには、オーディオ、ビデオ、またはその両方のどれを照会するかを指定する CodecKind 値、エンコーダーとデコーダーのどちらを照会するかを指定する CodecCategory 値、照会するメディア エンコード サブタイプを表す文字列 (H.264 ビデオや MP3 オーディオなど) が含まれます。

すべてサブタイプのコーデックを返すには、サブタイプ値として空の文字列を指定します。 次の例では、デバイスにインストールされているすべてのビデオ エンコーダーの一覧が取得されます。

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

FindAllAsync に渡すサブタイプ文字列には、システムで定義されているサブタイプ GUID の文字列表現またはサブタイプの FOURCC コードを指定できます。 一連のサポートされるメディア サブタイプの GUID は、「オーディオ サブタイプの GUID」と「ビデオ サブタイプの GUID」の記事に示されていますが、CodecSubtypes クラスには、サポートされている各サブタイプの GUID 値を返すプロパティが用意されています。 FOURCC コードの詳細については、FOURCC コードに関する記事をご覧ください。

次の例では、デバイスに H.264 ビデオ デコーダーがインストールされているかどうかを確認するために、FOURCC コード "H264" を指定しています。 H.264 ビデオ コンテンツを再生する前に、このクエリを実行できます。 また、再生時にサポートされていないコーデックを処理することもできます。 詳しくは、「メディア項目を開く際にサポートされていないコーデックと不明なエラーを処理する」をご覧ください。

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

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

次の例では、現在のデバイスに FLAC オーディオ エンコーダーがインストールされているかどうかを照会して確認し、インストールされている場合は、オーディオをファイルにキャプチャしたり、オーディオを別の形式から FLAC オーディオ ファイルにトランスコードしたりするために使用できる MediaEncodingProfile がこのサブタイプ用に作成されます。

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