现在都是有现成的摄像头软件来显示或者保存视频资料,一款通用的软件就是vp-eye既然这样,就说明每种摄像头的数据流格式都是一样的。现在我想自己启动摄像头,取得摄像头的数据。而且还是2个摄像头请问有人知道么?或者给我点资料看看

解决方案 »

  1.   

    net这方面的开发功能好象没有吧,如果用C++或调用COM对象好象还可以吧
      

  2.   

    C#捕捉视频头(源码) using System;
    using System.Runtime.InteropServices;namespace Wuyin.ShoesManager
    {
        /// <summary>
        /// VedioCapture 的摘要说明。
        /// </summary>
        public class VedioCapture
        {
            private int hCaptureM;
            private bool isUnLoad = false;
            public VedioCapture()
            {        
            }
            [DllImport("avicap32.dll")]
            private static extern int capCreateCaptureWindow( string strWindowName, int dwStyle, int x, int y ,int width, int height , int hwdParent, int nID );
            [DllImport("user32.dll")]
            private static extern int SendMessage( int hwnd , int wMsg, int wParam , int lParam );
            [DllImport("user32.dll")]
            private static extern int SendMessage( int hwnd , int wMsg, int wParam , string lParam );
            [DllImport("Kernel32.dll")]
            private static extern bool CloseHandle( int hObject );
            public bool Initialize( System.Windows.Forms.Control aContainer , int intWidth, int intHeight )
            {
                hCaptureM = capCreateCaptureWindow( "", 0x40000000 | 0x10000000, 0,0,intWidth,intHeight,aContainer.Handle.ToInt32() ,1 );
                if( hCaptureM == 0 ) return false;
                
                int ret = SendMessage( hCaptureM , 1034, 0,0 );
                if( ret == 0 )
                {
                    CloseHandle(hCaptureM);
                    return false;
                }
                //WM_CAP_SET_PREVIEW
                ret = SendMessage( hCaptureM, 1074, 1, 0 );
                if( ret == 0 )
                {
                    this.UnLoad();
                    return false;
                }
                //WM_CAP_SET_SCALE
                ret = SendMessage( hCaptureM, 1077, 1, 0 );
                if( ret == 0 )
                {
                    this.UnLoad();
                    return false;
                }
                //WM_CAP_SET_PREVIEWRATE
                ret = SendMessage( hCaptureM, 1076, 66, 0 );
                if( ret == 0 )
                {
                    this.UnLoad();
                    return false;
                }
                return true;
            }        public void SingleFrameBegin()
            {
                //
                int ret = SendMessage( hCaptureM, 1094 , 0, 0 );
            }
            public void SingleFrameEnd()
            {
                //
                int ret = SendMessage( hCaptureM, 1095 , 0, 0 );
            }        public void SingleFrameMode()
            {
                //WM_CAP_GRAB_FRAME
                int ret = SendMessage(  hCaptureM, 1084 , 0, 0 );
                //WM_CAP_SET_PREVIEW 
                //int ret = SendMessage(  hCaptureM, 1074 , 0, 0 );
                //WM_CAP_SINGLE_FRAME
                //ret = SendMessage( hCaptureM, 1096 , 0, 0 );
            }
            public void PreviewMode()
            {
                int ret = SendMessage( hCaptureM, 1074 , 1, 0 );
            }                public void UnLoad()
            {
                int ret = SendMessage( hCaptureM, 1035, 0, 0 );
                CloseHandle( this.hCaptureM );
                isUnLoad = true;
            }        public void CopyToClipBorad()
            {
                int ret = SendMessage(  hCaptureM, 1054, 0, 0 );
            }        public void ShowFormatDialog()
            {
                int ret = SendMessage(  hCaptureM, 1065, 0, 0 );
            }
            public void SaveToDIB( string fileName )
            {
                int ret = SendMessage(  hCaptureM, 1049, 0, fileName );
            }        public void ShowDisplayDialog()
            {
                int ret = SendMessage( hCaptureM, 1067, 0, 0 );
            }
            public System.Drawing.Image getCaptureImage()
            {
                System.Windows.Forms.IDataObject iData = System.Windows.Forms.Clipboard.GetDataObject();
                System.Drawing.Image retImage = null;
                if( iData !=  null ) 
                {
                    if( iData.GetDataPresent( System.Windows.Forms.DataFormats.Bitmap ) )
                    {
                        retImage = (System.Drawing.Image)iData.GetData( System.Windows.Forms.DataFormats.Bitmap );
                    } 
                    else if( iData.GetDataPresent( System.Windows.Forms.DataFormats.Dib  ) )
                    {
                        retImage = (System.Drawing.Image)iData.GetData( System.Windows.Forms.DataFormats.Dib );
                    }
                }
                return retImage;
            }        ~VedioCapture()
            {
                if( !isUnLoad )
                {
                    this.UnLoad();
                }
            }
        }
    }
      

  3.   

    ruixing123(想入非非) 你能不能提供avicap32.dll这个dll函数的详细说明阿???
      

  4.   

    directshow 是一个现在的封穿以前有位朋友发过一个视频聊天程序的源代码,里面有视频这一块它是直接使用最原初的API操作的.媒体编程偶不是太熟
      

  5.   

    vfm SDK和directshow 都可以
      

  6.   

    正好这段时间参加一个微软的比赛用到这个了。就将部分实现代码给你看下:
    前面的类如同前面的那个一样给出,这是可以通用的。
    使用时的代码如下:
    //抓图并保存为JPEG图像文件
    vi.CopyToClipBorad();
    Image img = vi.getCaptureImage();
    Graphics g = pictureBox2.CreateGraphics();Rectangle rec = new Rectangle(0,0,320,240);
    g.DrawImage(img,rec,0,0,320,240,GraphicsUnit.Pixel);System.Drawing.Image bmp =null;
    bmp = System.Drawing.Bitmap.FromFile("ditu.bmp");
    System.Drawing.Graphics g1 = Graphics.FromImage(bmp);
    g1.DrawImage(img,rec,0,0,320,240,GraphicsUnit.Pixel);
    String fromTitle = titleBox.Text;
    String imgName;
    if(fromTitle.Equals(""))
    {
    imgName = DateTime.Now.ToLongDateString()+"_"+DateTime.Now.Hour+"_"+DateTime.Now.Minute+"_"+DateTime.Now.Second+".jpg";
    }
    else
    {
    imgName = fromTitle+".jpg";}
    System.Drawing.Rectangle(100,100,250,250));MessageBox.Show("the pic named "+imgName +"  has been saved!");
    bmp.Save(imgName,System.Drawing.Imaging.ImageFormat.Jpeg);img.Dispose();
    g1.Dispose();
    g.Dispose();
    bmp.Dispose();
      

  7.   

    晕,我是一台机器上2个摄像头,如何才能用那个dll启动2个摄像头呢???
    大家有没有那个dll里面的函数说明阿?
      

  8.   

    看api
    里面有个Capture的具体如
    ruixing123(想入非非)那样做就差不多的了