📄 mainform.cs
字号:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using System.IO;
using System.Diagnostics;
using System.Drawing.Imaging;
using DShowNET;
using DShowNET.Device;
namespace CaptureNET
{
/// <summary> Summary description for MainForm. </summary>
public class MainForm : System.Windows.Forms.Form, ISampleGrabberCB
{
private System.ComponentModel.IContainer components;
private System.Windows.Forms.ToolBar toolBar;
private System.Windows.Forms.Panel videoPanel;
private System.Windows.Forms.ImageList tbarImageList;
private ToolBar toolBar1;
private ToolBarButton toolBarBtnTune;
private ToolBarButton toolBarBtnGrab;
private ToolBarButton toolBarBtnSep;
private ToolBarButton toolBarBtnSave;
private Panel stillPanel;
private PictureBox pictureBox;
private Splitter splitter1;
private System.Windows.Forms.ToolBarButton tbtnStop;
public MainForm()
{
// Required for Windows Form Designer support
InitializeComponent();
}
/// <summary> Clean up any resources being used. </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.toolBar = new System.Windows.Forms.ToolBar();
this.tbtnStop = new System.Windows.Forms.ToolBarButton();
this.tbarImageList = new System.Windows.Forms.ImageList(this.components);
this.videoPanel = new System.Windows.Forms.Panel();
this.stillPanel = new System.Windows.Forms.Panel();
this.toolBar1 = new System.Windows.Forms.ToolBar();
this.toolBarBtnTune = new System.Windows.Forms.ToolBarButton();
this.toolBarBtnGrab = new System.Windows.Forms.ToolBarButton();
this.toolBarBtnSep = new System.Windows.Forms.ToolBarButton();
this.toolBarBtnSave = new System.Windows.Forms.ToolBarButton();
this.pictureBox = new System.Windows.Forms.PictureBox();
this.splitter1 = new System.Windows.Forms.Splitter();
this.stillPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
this.SuspendLayout();
//
// toolBar
//
this.toolBar.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {
this.tbtnStop});
this.toolBar.DropDownArrows = true;
this.toolBar.ImageList = this.tbarImageList;
this.toolBar.Location = new System.Drawing.Point(0, 0);
this.toolBar.Name = "toolBar";
this.toolBar.ShowToolTips = true;
this.toolBar.Size = new System.Drawing.Size(635, 41);
this.toolBar.TabIndex = 0;
this.toolBar.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar_ButtonClick);
//
// tbtnStop
//
this.tbtnStop.ImageIndex = 0;
this.tbtnStop.Name = "tbtnStop";
this.tbtnStop.Text = "Stop";
//
// tbarImageList
//
this.tbarImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("tbarImageList.ImageStream")));
this.tbarImageList.TransparentColor = System.Drawing.Color.Transparent;
this.tbarImageList.Images.SetKeyName(0, "");
//
// videoPanel
//
this.videoPanel.Location = new System.Drawing.Point(0, 82);
this.videoPanel.Name = "videoPanel";
this.videoPanel.Size = new System.Drawing.Size(377, 326);
this.videoPanel.TabIndex = 1;
this.videoPanel.Paint += new System.Windows.Forms.PaintEventHandler(this.videoPanel_Paint);
this.videoPanel.Resize += new System.EventHandler(this.videoPanel_Resize);
//
// stillPanel
//
this.stillPanel.AutoScroll = true;
this.stillPanel.AutoScrollMargin = new System.Drawing.Size(8, 8);
this.stillPanel.AutoScrollMinSize = new System.Drawing.Size(32, 32);
this.stillPanel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.stillPanel.Controls.Add(this.pictureBox);
this.stillPanel.Location = new System.Drawing.Point(383, 82);
this.stillPanel.Name = "stillPanel";
this.stillPanel.Size = new System.Drawing.Size(252, 326);
this.stillPanel.TabIndex = 4;
//
// toolBar1
//
this.toolBar1.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {
this.toolBarBtnTune,
this.toolBarBtnGrab,
this.toolBarBtnSep,
this.toolBarBtnSave});
this.toolBar1.Cursor = System.Windows.Forms.Cursors.Hand;
this.toolBar1.DropDownArrows = true;
this.toolBar1.Location = new System.Drawing.Point(0, 41);
this.toolBar1.Name = "toolBar1";
this.toolBar1.ShowToolTips = true;
this.toolBar1.Size = new System.Drawing.Size(635, 41);
this.toolBar1.TabIndex = 2;
this.toolBar1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar1_ButtonClick);
//
// toolBarBtnTune
//
this.toolBarBtnTune.Enabled = false;
this.toolBarBtnTune.ImageIndex = 0;
this.toolBarBtnTune.Name = "toolBarBtnTune";
this.toolBarBtnTune.Text = "Tune";
this.toolBarBtnTune.ToolTipText = "TV tuner dialog";
//
// toolBarBtnGrab
//
this.toolBarBtnGrab.ImageIndex = 1;
this.toolBarBtnGrab.Name = "toolBarBtnGrab";
this.toolBarBtnGrab.Text = "Grab";
this.toolBarBtnGrab.ToolTipText = "Grab picture from stream";
//
// toolBarBtnSep
//
this.toolBarBtnSep.Enabled = false;
this.toolBarBtnSep.Name = "toolBarBtnSep";
this.toolBarBtnSep.Style = System.Windows.Forms.ToolBarButtonStyle.Separator;
//
// toolBarBtnSave
//
this.toolBarBtnSave.Enabled = false;
this.toolBarBtnSave.ImageIndex = 2;
this.toolBarBtnSave.Name = "toolBarBtnSave";
this.toolBarBtnSave.Text = "Save";
this.toolBarBtnSave.ToolTipText = "Save image to file";
//
// pictureBox
//
this.pictureBox.Location = new System.Drawing.Point(3, 3);
this.pictureBox.Name = "pictureBox";
this.pictureBox.Size = new System.Drawing.Size(233, 232);
this.pictureBox.TabIndex = 0;
this.pictureBox.TabStop = false;
//
// splitter1
//
this.splitter1.Location = new System.Drawing.Point(0, 82);
this.splitter1.Name = "splitter1";
this.splitter1.Size = new System.Drawing.Size(3, 326);
this.splitter1.TabIndex = 7;
this.splitter1.TabStop = false;
//
// MainForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.BackColor = System.Drawing.Color.Black;
this.ClientSize = new System.Drawing.Size(635, 408);
this.Controls.Add(this.splitter1);
this.Controls.Add(this.toolBar1);
this.Controls.Add(this.videoPanel);
this.Controls.Add(this.stillPanel);
this.Controls.Add(this.toolBar);
this.Name = "MainForm";
this.Text = "Capture .NET";
this.Activated += new System.EventHandler(this.MainForm_Activated);
this.Closing += new System.ComponentModel.CancelEventHandler(this.MainForm_Closing);
this.stillPanel.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new MainForm());
}
private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
this.Hide();
CloseInterfaces();
}
/// <summary> handler for ToolBar button clicks. </summary>
private void toolBar_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if( capGraph == null )
return;
if( e.Button == tbtnStop )
{
this.Close();
}
}
/// <summary> detect first form appearance, start capturing. </summary>
private void MainForm_Activated(object sender, System.EventArgs e)
{
if( firstActive )
return;
firstActive = true;
if( ! DsUtils.IsCorrectDirectXVersion() )
{
MessageBox.Show( this, "DirectX 8.1 NOT installed!", "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
this.Close(); return;
}
if( ! DsDev.GetDevicesOfCat( FilterCategory.VideoInputDevice, out capDevices ) )
{
MessageBox.Show( this, "No video capture devices found!", "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
this.Close(); return;
}
SaveFileDialog sd = new SaveFileDialog();
sd.FileName = @"CaptureNET.avi";
sd.Title = "Save Video Stream as...";
sd.Filter = "Video file (*.avi)|*.avi";
sd.FilterIndex = 1;
if( sd.ShowDialog() != DialogResult.OK )
{ this.Close(); return; }
fileName = sd.FileName;
DsDevice dev = null;
if( capDevices.Count == 1 )
dev = capDevices[0] as DsDevice;
else
{
DeviceSelector selector = new DeviceSelector( capDevices );
selector.ShowDialog( this );
dev = selector.SelectedDevice;
}
if( dev == null )
{
this.Close(); return;
}
if( ! StartupVideo( dev.Mon ) )
this.Close();
this.Text = "- capturing -";
}
/// <summary> start all the interfaces, graphs and preview window. </summary>
bool StartupVideo( UCOMIMoniker mon )
{
int hr;
try {
if( ! CreateCaptureDevice( mon ) )
return false;
if( ! GetInterfaces() )
return false;
if( ! SetupGraph() )
return false;
if( ! SetupVideoWindow() )
return false;
#if DEBUG
DsROT.AddGraphToRot( graphBuilder, out rotCookie ); // graphBuilder capGraph
#endif
hr = mediaCtrl.Run();
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
bool hasTuner = DsUtils.ShowTunerPinDialog(capGraph, capFilter, this.Handle);
toolBarBtnTune.Enabled = hasTuner;
return true;
}
catch( Exception ee )
{
MessageBox.Show( this, "Could not start video stream\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
return false;
}
}
/// <summary> build the capture graph. </summary>
bool SetupGraph()
{
int hr;
IBaseFilter mux = null;
IFileSinkFilter sink = null;
try {
hr = capGraph.SetFiltergraph( graphBuilder );
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
hr = graphBuilder.AddFilter( capFilter, "Ds.NET Video Capture Device" );
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
DsUtils.ShowCapPinDialog( capGraph, capFilter, this.Handle );
Guid sub = MediaSubType.Avi;
hr = capGraph.SetOutputFileName( ref sub, fileName, out mux, out sink );
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
Guid cat = PinCategory.Capture;
Guid med = MediaType.Video;
hr = capGraph.RenderStream( ref cat, ref med, capFilter, null, mux ); // stream to file
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
cat = PinCategory.Preview;
med = MediaType.Video;
hr = capGraph.RenderStream( ref cat, ref med, capFilter, null, null ); // preview window
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
return true;
}
catch( Exception ee )
{
MessageBox.Show( this, "Could not setup graph\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
return false;
}
finally
{
if( mux != null )
Marshal.ReleaseComObject( mux ); mux = null;
if( sink != null )
Marshal.ReleaseComObject( sink ); sink = null;
}
}
/// <summary> create the used COM components and get the interfaces. </summary>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -