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