static void Main(string[] args) { Compressor[] comp = EnumCompressors(); foreach (Compressor c in comp) { Console.WriteLine(c.name); } Console.WriteLine("---"); // create BitmapWriter component and configure it IBitmapWriter writer = (IBitmapWriter) new CVideoRecorder(); writer.Init(100, 100, 5); // create DirectShow graph builder ICaptureGraphBuilder2 builder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2Cls(); // create AVIMux and file writer component IBaseFilter pMux; IFileSinkFilter unused; builder.SetOutputFileName(ref MEDIASUBTYPE_Avi, "test.avi", out pMux, out unused); IGraphBuilder graph; builder.GetFiltergraph(out graph); // add BitmapWriter as the source component graph.AddFilter((IBaseFilter)writer, "source"); // if the compressor is specified, add it IBaseFilter compressor = null; if (args.Length != 0) { compressor = comp[int.Parse(args[0])].compressor; graph.AddFilter(compressor, "compressor"); } // connect components builder.RenderStream(IntPtr.Zero, IntPtr.Zero, writer, compressor, pMux); // run the graph and send images IMediaControl control = (IMediaControl)graph; control.Run(); for (int i = 0; i < 10; i++) { Bitmap bmp = new Bitmap(@"..\..\test" + (i % 2) + ".bmp"); IntPtr hBmp = bmp.GetHbitmap(); writer.WriteBitmap((uint)hBmp.ToInt32()); DeleteObject(hBmp); bmp.Dispose(); } // stop the graph and flash any pending data throught the pipeline control.Stop(); Console.WriteLine("done"); }
/// <summary> /// Create a new recorder with the given setting. /// </summary> public Recorder(Rectangle rect, VCROptions config) { drawer = new QuarterViewDrawer(World.world, MainWindow.mainWindow.directDraw, rect); // register timer World.world.clock.registerRepeated(new ClockHandler(capture), TimeLength.fromMinutes(config.period)); // create BitmapWriter component and configure it writer = (IBitmapWriter) new CVideoRecorder(); writer.Init(rect.Width, rect.Height, config.fps); // create DirectShow graph builder ICaptureGraphBuilder2 builder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2Cls(); // create AVIMux and file writer component IBaseFilter pMux; IFileSinkFilter unused; builder.SetOutputFileName(ref MEDIASUBTYPE_Avi, "test.avi", out pMux, out unused); builder.GetFiltergraph(out graph); // add BitmapWriter as the source component graph.AddFilter((IBaseFilter)writer, "source"); // if the compressor is specified, add it IBaseFilter compressor = config.compressor.bind(); graph.AddFilter(compressor, "compressor"); // connect components builder.RenderStream(IntPtr.Zero, IntPtr.Zero, writer, compressor, pMux); mediaControl = (IMediaControl)graph; // explicitly release local objects // Marshal.ReleaseComObject(builder); // Marshal.ReleaseComObject(pMux); // Marshal.ReleaseComObject(unused); // Marshal.ReleaseComObject(compressor); }