protected override void CreateMediaTarget(SinkWriter sinkWriter, Size2 videoPixelSize, out int streamIndex) { using (MF.MediaType mediaTypeOut = new MF.MediaType()) { mediaTypeOut.Set <Guid>(MF.MediaTypeAttributeKeys.MajorType, MF.MediaTypeGuids.Video); mediaTypeOut.Set <Guid>(MF.MediaTypeAttributeKeys.Subtype, VIDEO_ENCODING_FORMAT); mediaTypeOut.Set <int>(MF.MediaTypeAttributeKeys.AvgBitrate, Bitrate); mediaTypeOut.Set <int>(MF.MediaTypeAttributeKeys.InterlaceMode, (int)MF.VideoInterlaceMode.Progressive); mediaTypeOut.Set <long>(MF.MediaTypeAttributeKeys.FrameSize, MFHelper.GetMFEncodedIntsByValues(videoPixelSize.Width, videoPixelSize.Height)); mediaTypeOut.Set <long>(MF.MediaTypeAttributeKeys.FrameRate, MFHelper.GetMFEncodedIntsByValues(Framerate, 1)); sinkWriter.AddStream(mediaTypeOut, out streamIndex); } }
public MediaFoundationVideoWriter(string filePath, Size2 videoPixelSize, Guid videoInputFormat, bool supportAudio = false) { bitrate = 1500000; framerate = 15; if (!MFInitialized) { // Initialize MF library. MUST be called before any MF related operations. MF.MediaFactory.Startup(MF.MediaFactory.Version, 0); } sinkWriter = MF.MediaFactory.CreateSinkWriterFromURL(filePath, IntPtr.Zero, null); this.videoPixelSize = videoPixelSize; CreateMediaTarget(sinkWriter, videoPixelSize, out streamIndex); // Configure input using (MF.MediaType mediaTypeIn = new MF.MediaType()) { mediaTypeIn.Set <Guid>(MF.MediaTypeAttributeKeys.MajorType, MF.MediaTypeGuids.Video); mediaTypeIn.Set <Guid>(MF.MediaTypeAttributeKeys.Subtype, videoInputFormat); mediaTypeIn.Set <int>(MF.MediaTypeAttributeKeys.InterlaceMode, (int)MF.VideoInterlaceMode.Progressive); mediaTypeIn.Set <long>(MF.MediaTypeAttributeKeys.FrameSize, MFHelper.GetMFEncodedIntsByValues(videoPixelSize.Width, videoPixelSize.Height)); mediaTypeIn.Set <long>(MF.MediaTypeAttributeKeys.FrameRate, MFHelper.GetMFEncodedIntsByValues(framerate, 1)); sinkWriter.SetInputMediaType(streamIndex, mediaTypeIn, null); } if (supportAudio) { // initialize audio writer var waveFormat = WAVEFORMATEX.DefaultPCM; audioWriter = new MP3AudioWriter(sinkWriter, ref waveFormat); } // Start writing the video file. MUST be called before write operations. sinkWriter.BeginWriting(); // Set initial frame index frameIndex = -1; }