/// <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> /// 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); } }