查询设备上安装的编解码器

CodecQuery 类允许查询当前设备上安装的编解码器。 支持的编解码器一文中列出了 Windows 针对不同设备系列随附的编解码器,但由于用户和应用可以在设备上安装其他编解码器,因此你可能需要在运行时查询编解码器支持情况,以确定当前设备上有哪些可用的编解码器。

通过调用构造函数初始化 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)
{
    codecResultsTextBox.Text += "============================================================\n";
    codecResultsTextBox.Text += string.Format("Codec: {0}\n", codecInfo.DisplayName);
    codecResultsTextBox.Text += string.Format("Kind: {0}\n", codecInfo.Kind.ToString());
    codecResultsTextBox.Text += string.Format("Category: {0}\n", codecInfo.Category.ToString());
    codecResultsTextBox.Text += string.Format("Trusted: {0}\n", codecInfo.IsTrusted.ToString());

    foreach (string subType in codecInfo.Subtypes)
    {
        codecResultsTextBox.Text += string.Format("   Subtype: {0}\n", subType);
    }
}

传入 FindAllAsync 的子类型字符串可以是系统定义的子类型 GUID 的字符串表示形式,也可以是子类型的 FOURCC 代码。 支持的媒体子类型 GUID 集列在 音频子类型 GUID视频子类型 GUID 一文中,但 CodecSubtypes 类提供返回每个受支持的子类型的 GUID 值的属性。 有关 FOURCC 代码的详细信息,请参阅 FOURCC 代码

以下示例指定 FOURCC 代码“H264”,以确定设备上是否安装了 H.264 视频解码器。 在尝试播放 H.264 视频内容之前,可以执行此查询。 也可以在播放时处理不受支持的编解码器。 有关详细信息,请参阅 打开媒体项时处理不受支持的编解码器和未知错误

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

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

以下示例查询以确定 FLAC 音频编码器是否已安装在当前设备上,如果是,则为 MediaEncodingProfile 创建,该子类型可用于捕获音频到文件,或者将音频从另一种格式转码为 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;
}