从网上下了一个操作摄像头的类函数,不过在启动的时候,显示的的屏幕总是一片漆黑,并没有图像显示,有哪位高手知道什么原因啊,vs2008+windows7平台,并且从网上下的其他的代码试了,也不行,也显示的的是一片漆黑

解决方案 »

  1.   

    public class cVideo
      {
      //导入API函数
      [DllImport("avicap32.dll")]
      private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
      [DllImport("avicap32.dll")]
      private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
      [DllImport("User32.dll")]
      private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
      //常量设置
      private const int WM_USER = 0x400;
      private const int WS_CHILD = 0x40000000;
      private const int WS_VISIBLE = 0x10000000;
      private const int WM_CAP_START = WM_USER;
      private const int WM_CAP_STOP = WM_CAP_START + 68;
      private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
      private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
      private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
      private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
      private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
      private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
      private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
      private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
      private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
      private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
      private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
      private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;
      private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
      private const int WM_CAP_SET_SCALE = WM_CAP_START + 53;
      private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
      private const int WM_CAP_FILE_SAVEAS = WM_CAP_START + 23; //将捕捉文件保存为另一个用户指定的文件。这个消息不会改变捕捉文件的名字和内容,  //全局变量
      private IntPtr hWndC; //句柄
      private IntPtr mControlPtr; //句柄
      private bool bWorkStart = false;
      private int mWidth;  //视频显示宽度
      private int mHeight; //视频显示高度
      private int mLeft; //视频显示左边距
      private int mTop; //视频显示上边距
      /// <summary>   
      /// 初始化显示图像   
      /// </summary>   
      /// <param name="handle">播放视频控件的句柄</param>   
      /// <param name="left">视频显示的左边距</param>   
      /// <param name="top">视频显示的上边距</param>
      /// <param name="down">视频显示的下边距</param>
      /// <param name="right">视频显示的右边距</param>
      /// <param name="width">要显示视频的宽度</param>   
      /// <param name="height">要显示视频的长度</param>   
      public cVideo(IntPtr handle, int left, int top, int width, int height)
      {
      mControlPtr = handle;
      mWidth = width;
      mHeight = height;
      mLeft = left;
      mTop = top;
      }
      /// <summary>   
      /// 打开视频  
      /// </summary>   
      public void StartVideo()
      {
      if (bWorkStart)
      return;
      bWorkStart = true;
      byte[] lpszName = new byte[100];
      //创建播放窗口
      hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);  if (hWndC.ToInt32() != 0)
      {
      //显示视频
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
      SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
      SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 100, 0);
      SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
      SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
      }
      }
      /// <summary>   
      /// 关闭视频   
      /// </summary>   
      public void StopVideo()
      {
      SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
      bWorkStart = false;
      }  /// <summary>
      /// 拍照
      /// </summary>
      /// <param name="path">文件路径</param>
      public void Images(string path)
      {
      IntPtr imagePath = Marshal.StringToHGlobalAnsi(path);
      SendMessage(hWndC, WM_CAP_SAVEDIB, 0, imagePath.ToInt32());
      }  }以上为类代码
      

  2.   

    可以的啊。我也有使用过这些代码来实现视频的功能。这些代码实现视频的主要原理就是先要打开本地的摄像头,可以抓取到本地的图片,显示在picturebox上面,然后再将抓取到图片不断发送给对方,对方接到你发过去的图片后,再不断的显示在picturebox里面,就实现了简单是“视频”功能。比如说你要打开自己本地的摄像头,就可以这样实现:   cVideo viodeo = new cVideo(pictureBox1.Handle, pictureBox1.Width, pictureBox1.Height);
                viodeo.StartWebCam();这种方法实现的视频,关键就是看你传输图片的效率,如果效率比较低下的话,你的视频就会很“卡”LZ自己慢慢去体会,并优化吧
      

  3.   

    老问题了,这个一般是因为摄像头是免驱动的,所以这个办法不起作用了。
    一般的解决办法是使用DirectShow处理的。
    这个类库给你。以前写的。可以抓图。
    参考
      

  4.   

    button1_click里的代码确实是你写的这两行,但点击后,屏幕是黑的啊,没图像出来啊,不知啥原因啊
      

  5.   

    你换个xp系统试下看。我以前是在xp系统下实现的。你现在用的是win7系统,不知道是不是系统的问题win7貌似有蛮多东西都不兼容的
      

  6.   

    这位仁兄一下就说到点子上了啊,在此万分感谢啊,有改进后有录像功能的.dll文件没啊,
      

  7.   

    还有个问题,dll文件怎么不能引用啊,系统总是提示说不是不是microsoft.net组件,用什么办法来引用啊,高手
      

  8.   

    这个是标准的dll文件,不是com组件或者dotnet的组件,
    必须使用DllImport的方式。
    另外,我这个dll不带录制视频功能的。只有抓图的功能。
    录制的功能也做过了,但是没有在dll里面。
    录像的压缩也做了,录制完成也是avi格式的,使用的压缩技术是mp4的免费编码器。
    效果也还行。就是不能提供给你。真是很遗憾的事情。
      

  9.   

    就是这个:
    共有三个函数,以下以C++方式申明:
    //打开摄像头,目前只支持单一摄像头的取值,如果系统连接多个摄像头,只能取其中的一个,不能指定摄像头。
    //cTitle 传入 "";
    //Left 是距显示视频控件的左边距,一般是0
    //Top 是距显示视频控件的顶边距,一般是0
    //Width 是在显示视频控件中视频的显示宽度
    //Height 是在显示视频控件中视频的显示高度
    //Handle 是在显示视频控件的句柄
    //返回结果:打开摄像头的句柄。
    __stdcall HWND StartCamera(const char* cTitle, int Left, int Top, int Width, int Height, HWND Handle);
    //关闭摄像头。
    //返回结果是否关闭。
    __stdcall bool CloseCamera(HWND hWndC);
    //截取图片
    //hWndC,摄像头句柄。
    //要保存的文件名
    __stdcall bool SaveBmp(HWND hWndC, const char* cFileName);调用:
    HWND HCamera = NULL;HCamera = StartCamera("", 0, 0, Control.Width, Control.Height, Control.Handle);//要等待摄像头打开,出现视频才可以抓图。
    SaveBmp(HCamera, "C:\\TestCamera.Bmp");CloseCamera(HCamera);