/// <summary> /// Encodes a file /// </summary> /// <param name="outputFile">Output filename (container type is deduced from the filename)</param> /// <param name="inputProvider">Input provider (should be PCM, some encoders will also allow IEEE float)</param> public void Encode(string outputFile, IWaveProvider inputProvider) { if (inputProvider.WaveFormat.Encoding != WaveFormatEncoding.Pcm && inputProvider.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat) { throw new ArgumentException("Encode input format must be PCM or IEEE float"); } var inputMediaType = new MediaType(inputProvider.WaveFormat); var writer = CreateSinkWriter(outputFile); try { int streamIndex; writer.AddStream(outputMediaType.MediaFoundationObject, out streamIndex); // n.b. can get 0xC00D36B4 - MF_E_INVALIDMEDIATYPE here writer.SetInputMediaType(streamIndex, inputMediaType.MediaFoundationObject, null); PerformEncode(writer, streamIndex, inputProvider); } finally { Marshal.ReleaseComObject(writer); Marshal.ReleaseComObject(inputMediaType.MediaFoundationObject); } }
private WaveFormat GetCurrentWaveFormat(IMFSourceReader reader) { IMFMediaType uncompressedMediaType; reader.GetCurrentMediaType(MediaFoundationInterop.MF_SOURCE_READER_FIRST_AUDIO_STREAM, out uncompressedMediaType); // Two ways to query it, first is to ask for properties (second is to convert into WaveFormatEx using MFCreateWaveFormatExFromMFMediaType) var outputMediaType = new MediaType(uncompressedMediaType); Guid actualMajorType = outputMediaType.MajorType; Debug.Assert(actualMajorType == MediaTypes.MFMediaType_Audio); Guid audioSubType = outputMediaType.SubType; int channels = outputMediaType.ChannelCount; int bits = outputMediaType.BitsPerSample; int sampleRate = outputMediaType.SampleRate; return audioSubType == AudioSubtypes.MFAudioFormat_PCM ? new WaveFormat(sampleRate, bits, channels) : WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, channels); }
/// <summary> /// Creates a new encoder that encodes to the specified output media type /// </summary> /// <param name="outputMediaType">Desired output media type</param> public MediaFoundationEncoder(MediaType outputMediaType) { if (outputMediaType == null) throw new ArgumentNullException("outputMediaType"); this.outputMediaType = outputMediaType; }
/// <summary> /// Creates the reader (overridable by ) /// </summary> protected virtual IMFSourceReader CreateReader(MediaFoundationReaderSettings settings) { IMFSourceReader reader; MediaFoundationInterop.MFCreateSourceReaderFromURL(file, null, out reader); reader.SetStreamSelection(MediaFoundationInterop.MF_SOURCE_READER_ALL_STREAMS, false); reader.SetStreamSelection(MediaFoundationInterop.MF_SOURCE_READER_FIRST_AUDIO_STREAM, true); // Create a partial media type indicating that we want uncompressed PCM audio var partialMediaType = new MediaType(); partialMediaType.MajorType = MediaTypes.MFMediaType_Audio; partialMediaType.SubType = settings.RequestFloatOutput ? AudioSubtypes.MFAudioFormat_Float : AudioSubtypes.MFAudioFormat_PCM; // set the media type // can return MF_E_INVALIDMEDIATYPE if not supported reader.SetCurrentMediaType(MediaFoundationInterop.MF_SOURCE_READER_FIRST_AUDIO_STREAM, IntPtr.Zero, partialMediaType.MediaFoundationObject); return reader; }