Audio and MIDI library for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
4.3 KiB

  1. # Enumerate Media Foundation Transforms
  2. The `MediaFoundationReader` and `MediaFoundationEncoder` classes in NAudio make use of any available Media Foundation Transforms installed on your computer. It can be useful to enumerate any audio related MFTs on your computer.
  3. There are three types of audio MFT - effects, decoders and encoders. A decoder allows you to decode audio compressed in different formats to PCM. An encoder allows you to encode PCM audio into compressed formats. An effect modifies audio in some way. The most
  4. You can use `MediaFoundationApi.EnumerateTransforms` to explore
  5. ```c#
  6. var effects = MediaFoundationApi.EnumerateTransforms(MediaFoundationTransformCategories.AudioEffect);
  7. var decoders = MediaFoundationApi.EnumerateTransforms(MediaFoundationTransformCategories.AudioDecoder);
  8. var encoder = MediaFoundationApi.EnumerateTransforms(MediaFoundationTransformCategories.AudioEncoder);
  9. ```
  10. These return an `IEnumerable<IMFActivate>`. This is a fairly low-level interface. Here's some code that will describe an `IMFActivate` by exploring its attributes:
  11. ```c#
  12. private string DescribeMft(IMFActivate mft)
  13. {
  14. mft.GetCount(out var attributeCount);
  15. var sb = new StringBuilder();
  16. for (int n = 0; n < attributeCount; n++)
  17. {
  18. AddAttribute(mft, n, sb);
  19. }
  20. return sb.ToString();
  21. }
  22. private static void AddAttribute(IMFActivate mft, int index, StringBuilder sb)
  23. {
  24. var variantPtr = Marshal.AllocHGlobal(MarshalHelpers.SizeOf<PropVariant>());
  25. try
  26. {
  27. mft.GetItemByIndex(index, out var key, variantPtr);
  28. var value = MarshalHelpers.PtrToStructure<PropVariant>(variantPtr);
  29. var propertyName = FieldDescriptionHelper.Describe(typeof (MediaFoundationAttributes), key);
  30. if (key == MediaFoundationAttributes.MFT_INPUT_TYPES_Attributes ||
  31. key == MediaFoundationAttributes.MFT_OUTPUT_TYPES_Attributes)
  32. {
  33. var types = value.GetBlobAsArrayOf<MFT_REGISTER_TYPE_INFO>();
  34. sb.AppendFormat("{0}: {1} items:", propertyName, types.Length);
  35. sb.AppendLine();
  36. foreach (var t in types)
  37. {
  38. sb.AppendFormat(" {0}-{1}",
  39. FieldDescriptionHelper.Describe(typeof (MediaTypes), t.guidMajorType),
  40. FieldDescriptionHelper.Describe(typeof (AudioSubtypes), t.guidSubtype));
  41. sb.AppendLine();
  42. }
  43. }
  44. else if (key == MediaFoundationAttributes.MF_TRANSFORM_CATEGORY_Attribute)
  45. {
  46. sb.AppendFormat("{0}: {1}", propertyName,
  47. FieldDescriptionHelper.Describe(typeof (MediaFoundationTransformCategories), (Guid) value.Value));
  48. sb.AppendLine();
  49. }
  50. else if (value.DataType == (VarEnum.VT_VECTOR | VarEnum.VT_UI1))
  51. {
  52. var b = (byte[]) value.Value;
  53. sb.AppendFormat("{0}: Blob of {1} bytes", propertyName, b.Length);
  54. sb.AppendLine();
  55. }
  56. else
  57. {
  58. sb.AppendFormat("{0}: {1}", propertyName, value.Value);
  59. sb.AppendLine();
  60. }
  61. }
  62. finally
  63. {
  64. PropVariant.Clear(variantPtr);
  65. Marshal.FreeHGlobal(variantPtr);
  66. }
  67. }
  68. ```
  69. Here's an example output for an MFT effect. In this case, the Resampler which is a very useful MFT for changing sample rates:
  70. ```
  71. Audio Effect
  72. Name: Resampler MFT
  73. Input Types: 2 items:
  74. Audio-PCM
  75. Audio-IEEE floating-point
  76. Class identifier: f447b69e-1884-4a7e-8055-346f74d6edb3
  77. Output Types: 2 items:
  78. Audio-PCM
  79. Audio-IEEE floating-point
  80. Transform Flags: 1
  81. Transform Category: Audio Effect
  82. ```
  83. Here's an example output for a decoder. This shows Windows 10 can decode the Opus audio codec:
  84. ```
  85. Audio Decoder
  86. Name: Microsoft Opus Audio Decoder MFT
  87. Input Types: 1 items:
  88. Audio-0000704f-0000-0010-8000-00aa00389b71
  89. Class identifier: 63e17c10-2d43-4c42-8fe3-8d8b63e46a6a
  90. Output Types: 1 items:
  91. Audio-IEEE floating-point
  92. Transform Flags: 1
  93. Transform Category: Audio Decoder
  94. ```
  95. And an encoder. This is another one new to Windows 10 - it comes with a FLAC encoder:
  96. ```
  97. Audio Encoder
  98. Name: Microsoft FLAC Audio Encoder MFT
  99. Input Types: 1 items:
  100. Audio-PCM
  101. Class identifier: 128509e9-c44e-45dc-95e9-c255b8f466a6
  102. Output Types: 1 items:
  103. Audio-0000f1ac-0000-0010-8000-00aa00389b71
  104. Transform Flags: 1
  105. Transform Category: Audio Encoder
  106. ```