查詢裝置上安裝的轉碼器
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 程式碼。 Audio Subtype GUID 和 Video Subtype GUID 文章中列出了受支援的媒體子類型 GUID 集,但 CodecSubtypes 類別提供了傳回每個受支援子類型的 GUID 值的屬性。 如需 FOURCC 程式碼的詳細資訊,請參閱 FOURCC Codes
下列範例會指定 FOURCC 程式碼「H264」 來判斷裝置上是否已安裝 H.264 視訊解碼器。 您可以先執行此查詢,再嘗試播放 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 音訊編碼器,如果安裝了,則為子類型建立 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;
}
相關主題