示例#1
0
        /// <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());
        }
示例#2
0
        /// <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());
        }
示例#3
0
        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());
        }