/// <summary> /// Gets all the available media types for a particular /// </summary> /// <param name="audioSubtype">Audio subtype - a value from the AudioSubtypes class</param> /// <returns>An array of available media types that can be encoded with this subtype</returns> public static MediaType[] GetOutputMediaTypes(Guid audioSubtype) { IMFCollection availableTypes; try { MediaFoundationInterop.MFTranscodeGetAudioOutputAvailableTypes( audioSubtype, _MFT_ENUM_FLAG.MFT_ENUM_FLAG_ALL, null, out availableTypes); } catch (COMException c) { if (c.GetHResult() == MediaFoundationErrors.MF_E_NOT_FOUND) { // Don't worry if we didn't find any - just means no encoder available for this type return(new MediaType[0]); } else { throw; } } availableTypes.GetElementCount(out int count); var mediaTypes = new List <MediaType>(count); for (int n = 0; n < count; n++) { availableTypes.GetElement(n, out object mediaTypeObject); var mediaType = (IMFMediaType)mediaTypeObject; mediaTypes.Add(new MediaType(mediaType)); } Marshal.ReleaseComObject(availableTypes); return(mediaTypes.ToArray()); }
/// <summary> /// Gets all the available media types for a particular /// </summary> /// <param name="audioSubtype">Audio subtype - a value from the AudioSubtypes class</param> /// <returns>An array of available media types that can be encoded with this subtype</returns> // Token: 0x0600093B RID: 2363 RVA: 0x0001AB68 File Offset: 0x00018D68 public static MediaType[] GetOutputMediaTypes(Guid audioSubtype) { IMFCollection imfcollection; try { MediaFoundationInterop.MFTranscodeGetAudioOutputAvailableTypes(audioSubtype, _MFT_ENUM_FLAG.MFT_ENUM_FLAG_ALL, null, out imfcollection); } catch (COMException exception) { if (exception.GetHResult() == -1072875819) { return(new MediaType[0]); } throw; } int num; imfcollection.GetElementCount(out num); List <MediaType> list = new List <MediaType>(num); for (int i = 0; i < num; i++) { object obj; imfcollection.GetElement(i, out obj); IMFMediaType mediaType = (IMFMediaType)obj; list.Add(new MediaType(mediaType)); } Marshal.ReleaseComObject(imfcollection); return(list.ToArray()); }
public static int[] GetEncodeBitrates(Guid audioSubtype, int sampleRate, int channels) { var bitRates = new HashSet <int>(); IMFCollection availableTypes; MediaFoundationInterop.MFTranscodeGetAudioOutputAvailableTypes( audioSubtype, _MFT_ENUM_FLAG.MFT_ENUM_FLAG_ALL, null, out availableTypes); int count; availableTypes.GetElementCount(out count); for (int n = 0; n < count; n++) { object mediaTypeObject; availableTypes.GetElement(n, out mediaTypeObject); var mediaType = (IMFMediaType)mediaTypeObject; // filter out types that are for the wrong sample rate and channels int samplesPerSecond; mediaType.GetUINT32(MediaFoundationAttributes.MF_MT_AUDIO_SAMPLES_PER_SECOND, out samplesPerSecond); if (sampleRate != samplesPerSecond) { continue; } int channelCount; mediaType.GetUINT32(MediaFoundationAttributes.MF_MT_AUDIO_NUM_CHANNELS, out channelCount); if (channels != channelCount) { continue; } int bytesPerSecond; mediaType.GetUINT32(MediaFoundationAttributes.MF_MT_AUDIO_AVG_BYTES_PER_SECOND, out bytesPerSecond); bitRates.Add(bytesPerSecond * 8); Marshal.ReleaseComObject(mediaType); } Marshal.ReleaseComObject(availableTypes); return(bitRates.ToArray()); }