查詢裝置上安裝的轉碼器

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