下载Afoge.net,里面有个two camera test,你依葫芦画瓢就可以控制多个了

解决方案 »

  1.   

    具体的说是这样的
    通过这句发送的 SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, nCameraID, 0 
    我的两个usb口连着两个摄像头 我改成SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, 0, 0 程序捕捉的是默认的,但是 我改成SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, 1, 0 程序却捕捉不到另一个设备,不知道怎么弄?
      

  2.   

    这个方法,如果是连接到电脑的免驱动摄像头,不能打开摄像头。
    使用directShow最好。
    http://download.csdn.net/detail/mjp1234airen4385/3607954
    看看这个类库,你能不能用
      

  3.   

    就是同时打开两个摄像头,进行录像功能,我要怎么控制打开指定的摄像头如果你只要控制2个摄像头,并且要指定,我上面所得Aforge.net解决你的问题妥妥的。至于楼上说的Afoge.net控制多个摄像头会卡,但可能控制的比较多。2个的话肯定没问题。 至于代码 ,等你下载好后  ,示例程序里的代码你基本只要会复制粘贴即可
      

  4.   

    就是同时打开两个摄像头,进行录像功能,我要怎么控制打开指定的摄像头如果你只要控制2个摄像头,并且要指定,我上面所得Aforge.net解决你的问题妥妥的。至于楼上说的Afoge.net控制多个摄像头会卡,但可能控制的比较多。2个的话肯定没问题。 至于代码 ,等你下载好后  ,示例程序里的代码你基本只要会复制粘贴即可
    其实我最终的目的还是做一个可以添加多个摄像头的系统,但也很感谢你的回答!
      

  5.   

    panle1控件对应摄像头0,panle2对应的是摄像头1,打开摄像头0时显示在panle1,当同时打开摄像头1时,panle1中的摄像头0黑了,panle2正常显示摄像头1,这是为什么,难道是要用多线程还是怎样,就大神指点。。
      

  6.   

     public partial class Form1 : Form
        {
            /// <summary>
            /// 获取系统安装的摄像头列表
            /// </summary>
            /// <returns>返回格式:0|USB视频设备|1|USB摄像头,其中0或1是摄像头ID</returns>
            [DllImport("VedioCapture.dll")]
            private extern static string GetCameraList();
            /// <summary>
            /// 设置打开的摄像头ID
            /// </summary>
            /// <param name="value">GetCameraList中列举的摄像头ID</param>
            /// <returns>返回0,设置成功</returns>
            [DllImport("VedioCapture.dll")]    
            private extern static int SetCameraID(int value);
            /// <summary>
            /// 打开SetCameraID中设置的摄像头
            /// </summary>
            /// <param name="Handle">要显示视频的控件</param>
            /// <returns>摄像头句柄</returns>
            [DllImport("VedioCapture.dll")]    
            private extern static IntPtr StartCamera(IntPtr Handle);
            /// <summary>
            /// 关闭摄像头
            /// </summary>
            /// <param name="hWndC">摄像头句柄</param>
            /// <returns>返回0,设置成功</returns>
            [DllImport("VedioCapture.dll")]  
            private extern static int CloseCamera(IntPtr hWndC);
            /// <summary>
            /// 截取BMP格式的视频图像
            /// </summary>
            /// <param name="hWndC">摄像头句柄</param>
            /// <param name="cFileName">截取的bmp文件名,或则-1(代表内存图片)</param>
            /// <returns>如果cFileName传入文件名,返回0,截取成功;如果cFileName传入-1,返回bmp图片的句柄(请使用后注意释放)</returns>
            [DllImport("VedioCapture.dll")]    
            private extern static int SaveBmp(IntPtr hWndC,  string  cFileName);
            /// <summary>
            /// 开始录制视频
            /// </summary>
            /// <param name="hWndC">摄像头句柄</param>
            /// <param name="cFileName">视频文件名</param>
            /// <returns>返回0,开始录制</returns>
            [DllImport("VedioCapture.dll")]    
            private extern static int RecordVideo(IntPtr hWndC, string  cFileName);
            /// <summary>
            /// 停止录制视频
            /// </summary>
            /// <param name="hWndC">摄像头句柄</param>
            /// <returns>返回0,停止成功</returns>
            [DllImport("VedioCapture.dll")]  
            private extern static int StopRecord(IntPtr hWndC);
            /// <summary>
            /// 将现有的图片文件制作成视频,仅支持bmp和jpg格式的图片
            /// </summary>
            /// <param name="cPath">图片文件所在路径,以/结尾</param>
            /// <param name="cFileName">制作后的视频文件名</param>
            /// <param name="cFileType">图片类型:jpg或bmp</param>
            /// <param name="FrameRate">视频写入帧率,摄像头常用15帧,</param>
            /// <returns>返回0,制作成功</returns>
            [DllImport("VedioCapture.dll")]
             
            private extern static int CreateVideoByFiles(string cPath, string cFileName, string cFileType, int FrameRate);
            
            string AppPath = "";
           
            public Form1()
            {
                InitializeComponent();
                AppPath = Application.StartupPath + "\\";
             }
            
            IntPtr camerah1 = IntPtr.Zero;
            IntPtr camerah2 = IntPtr.Zero;
            private void button1_Click(object sender, EventArgs e)
            {
                if (button1.Text == "开始")
                {
                    SetCameraID(0);
                    camerah1=StartCamera(panel1.Handle);
                    button1.Text = "停止";
                }
                else
                {
                    CloseCamera(camerah1);
                    button1.Text = "开始";
                 }        }        private void button2_Click(object sender, EventArgs e)
            {
                if (button2.Text == "开始")
                {
                    SetCameraID(1);
                    camerah2= StartCamera(panel2.Handle);
                    button2.Text = "停止";
                }
                else
                {
                    CloseCamera(camerah2);
                    button2.Text = "开始";
                }        }            private void button5_Click(object sender, EventArgs e)
            {
                if (camerah1 != IntPtr.Zero)
                {
                    //传入文件路径
                    SaveBmp(camerah1, AppPath + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp");
                    //传入-1,返回内存图片
                    IntPtr iptr = (IntPtr)SaveBmp(camerah1, "-1");
                    Bitmap bmp = Bitmap.FromHbitmap(iptr);
                    bmp.Save(AppPath + "1号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp");
                    bmp.Dispose();
                }
            }        private void button6_Click(object sender, EventArgs e)
            {
                if (button6.Text == "录像")
                {
                    if (camerah1 != IntPtr.Zero)
                    {
                        button6.Text = "停止";
                        RecordVideo(camerah1, AppPath + "1号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi");
                    }
                }
                else
                {
                    if (camerah1 != IntPtr.Zero)
                    { 
                        StopRecord(camerah1); 
                        button6.Text = "录像"; 
                    }
                }
            }        private void button7_Click(object sender, EventArgs e)
            {
                if (camerah2 != IntPtr.Zero)
                {
                    //传入文件路径
                    SaveBmp(camerah2, AppPath + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp");
                    //传入-1,返回内存图片
                    IntPtr iptr = (IntPtr)SaveBmp(camerah2, "-1");
                    Bitmap bmp = Bitmap.FromHbitmap(iptr);
                    bmp.Save(AppPath + "2号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp");
                    bmp.Dispose();
                }
            }        private void button8_Click(object sender, EventArgs e)
            {
                if (button8.Text == "录像")
                {
                    if (camerah2 != IntPtr.Zero)
                    {
                        button8.Text = "停止";
                        RecordVideo(camerah2, AppPath + "2号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi");
                    }
                }
                else
                {
                    if (camerah2 != IntPtr.Zero)
                    {
                        StopRecord(camerah2);
                        button8.Text = "录像";
                    }
                }
            }
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (MessageBox.Show("确实要退出系统吗?", "系统", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {                this.Dispose();
                    Application.Exit();
                }
                else
                {
                    e.Cancel = true;
                }
            }
    这是我的代码
      

  7.   

    并且我录制的时候录制的文件是OKB,你说的那个东西我也安装了,不知道为什么
      

  8.   

    我这里也没有两个摄像头,在C#示例里有多线程调用方式,你试试看。
    调用dll,dll内部记录了显示面板的句柄
      

  9.   


    Aforge 提供了2种 录像的方法
      

  10.   

    你的摄像头是什么摄像头,是专业开发的摄像头还是普通直接插上能被Windows识别的摄像头,前者是调用厂家提供的DLL,后者也就是用Windows的技术DirectShow,有一些成熟的类库帮你封装成.NET版了,上面提到的AForge就是一个很好的库。
      

  11.   

    我看你用的是VedioCapture.dll,这是什么DLL?
      

  12.   

    看你用的“SendMessage”,这不是avicap32.DLL吗?它确实只能捕获一个摄像头(据同事使用)。
      

  13.   

    [email protected]   感谢了!!!