C#如何将摄像头的图像保存为视频文件,我的代码如下
string path="C:\\"; SaveFileDialog SaveFileDialog2 = new SaveFileDialog();
SaveFileDialog2.FileName = DateTime.Now.ToString("yyyyMMddhhmmss");
SaveFileDialog2.Filter = "AVI Files(*.avi)|*.avi|All files (*.*)|*.*";
if (SaveFileDialog2.ShowDialog() == DialogResult.OK)
{
path = SaveFileDialog2.FileName;
}
else
{
return;
}
int intDevice = 0;
string refDevice = intDevice.ToString();
vid.hHwnd = vidio.capCreateCaptureWindowA(ref refDevice, 1342177280, 0, 0, 640, 480, vid.panel1.Handle.ToInt32(), 0); vidio.SendMessage(vid.hHwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
vidio.SendMessage(vid.hHwnd, WM_CAP_SET_PREVIEWRATE, 100, 0);
vidio.SendMessage(vid.hHwnd, WM_CAP_SET_PREVIEW, 1, 0);
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
vidio.SendMessage(vid.hHwnd, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64());
vidio.SendMessage(vid.hHwnd, WM_CAP_SEQUENCE, 0, 0);
}
string path="C:\\"; SaveFileDialog SaveFileDialog2 = new SaveFileDialog();
SaveFileDialog2.FileName = DateTime.Now.ToString("yyyyMMddhhmmss");
SaveFileDialog2.Filter = "AVI Files(*.avi)|*.avi|All files (*.*)|*.*";
if (SaveFileDialog2.ShowDialog() == DialogResult.OK)
{
path = SaveFileDialog2.FileName;
}
else
{
return;
}
int intDevice = 0;
string refDevice = intDevice.ToString();
vid.hHwnd = vidio.capCreateCaptureWindowA(ref refDevice, 1342177280, 0, 0, 640, 480, vid.panel1.Handle.ToInt32(), 0); vidio.SendMessage(vid.hHwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
vidio.SendMessage(vid.hHwnd, WM_CAP_SET_PREVIEWRATE, 100, 0);
vidio.SendMessage(vid.hHwnd, WM_CAP_SET_PREVIEW, 1, 0);
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
vidio.SendMessage(vid.hHwnd, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64());
vidio.SendMessage(vid.hHwnd, WM_CAP_SEQUENCE, 0, 0);
}
摄像头操作可看看这个参数
{
public int hHwnd;
public vidio()
{
InitializeComponent();
} private void vidio_Load(object sender, EventArgs e)
{
}
public struct videohdr_tag
{
public byte[] lpData;
public int dwBufferLength;
public int dwBytesUsed;
public int dwTimeCaptured;
public int dwUser;
public int dwFlags;
public int[] dwReserved; }
public delegate bool CallBack(int hwnd, int lParam);
/// <summary>
/// 必需的设计器变量。
/// </summary>
//private System.ComponentModel.Container components = null;
[DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int capCreateCaptureWindowA([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszWindowName, int dwStyle, int x, int y, int nWidth, short nHeight, int hWndParent, int nID);
[DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool capGetDriverDescriptionA(short wDriver, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszName, int cbName, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszVer, int cbVer);
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool DestroyWindow(int hndw);
[DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int SendMessage(int hwnd, int wMsg, int wParam, [MarshalAs(UnmanagedType.AsAny)] object lParam);
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int SetWindowPos(int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
[DllImport("vfw32.dll")]
public static extern string capVideoStreamCallback(int hwnd, videohdr_tag videohdr_tag);
[DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool capSetCallbackOnFrame(int hwnd, string s);
[DllImport("User32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);
[DllImport("User32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam); public void OpenCapture()
{ int intWidth = this.panel1.Width;
int intHeight = this.panel1.Height;
int intDevice = 0;
string refDevice = intDevice.ToString();
hHwnd = capCreateCaptureWindowA(ref refDevice, 1342177280, 0, 0, 640, 480, this.panel1.Handle.ToInt32(), 0);
if (SendMessage(hHwnd, 0x40a, intDevice, 0) > 0)
{
SendMessage(this.hHwnd, 0x435, -1, 0);
SendMessage(this.hHwnd, 0x434, 0x42, 0);
SendMessage(this.hHwnd, 0x432, -1, 0);
SetWindowPos(this.hHwnd, 1, 0, 0, intWidth, intHeight, 6);
}
else
{
DestroyWindow(this.hHwnd);
}
}
vidio.SendMessage(vid.hHwnd, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64());
vidio.SendMessage(vid.hHwnd, WM_CAP_SEQUENCE, 0, 0);
许多程序就这三句就说可以,我的怎么不行