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

解决方案 »

  1.   

    看看vidio的相关说明
    摄像头操作可看看这个参数
      

  2.   

        public partial class vidio : Form
        {
            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);
                }
            }
      

  3.   

    参考:http://web1.codeproject.com/KB/audio-video/CaptureScreenAsVideo.aspx?msg=2855220
      

  4.   

    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);
     许多程序就这三句就说可以,我的怎么不行