监控编码

来源:互联网 发布:div中调用js函数 编辑:程序博客网 时间:2024/05/29 03:51
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace YangShi
{
  public  class cVideo
    {

          private  IntPtr  lwndC;       //保存无符号句柄
          private  IntPtr  mControlPtr;  //保存管理指示器
          private int  mWidth;
          private  int  mHeight;
          public cVideo(IntPtr handle, int width, int height)
          {
              mControlPtr = handle;  //显示视频控件的句柄
              mWidth = width;      //视频宽度
              mHeight = height;    //视频高度

          }
         /// 打开视频设备
        ///  </summary>
        public  void  StartWebCam()
        {
            byte[]  lpszName  =  new  byte[100];
            byte[]  lpszVer  =  new  byte[100];
            VideoAPI.capGetDriverDescriptionA(0,  lpszName,  100,  lpszVer,  100);
            this.lwndC  =  VideoAPI.capCreateCaptureWindowA(lpszName,  VideoAPI.WS_CHILD  |  VideoAPI.WS_VISIBLE,  0,  0,  mWidth,  mHeight,  mControlPtr,  0);
            if  (VideoAPI.SendMessage(lwndC,  VideoAPI.WM_CAP_DRIVER_CONNECT,  0,0))
            {
                VideoAPI.SendMessage(lwndC,  VideoAPI.WM_CAP_SET_PREVIEWRATE,  100,0);
                VideoAPI.SendMessage(lwndC,  VideoAPI.WM_CAP_SET_PREVIEW,  true,  0);
            }
        }
        ///  <summary>
        /// 关闭视频设备
        ///  </summary>
        public void CloseWebcam()
        {
            VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_DISCONNECT, 0,0);
        }
        ///   <summary>   
        ///   拍照
        ///   </summary>   
      ///   <param   name="path">要保存bmp文件的路径</param>   
        public  void  GrabImage(IntPtr  hWndC,  string  path)
        {
            IntPtr  hBmp  =  System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(path);
            VideoAPI.SendMessage(lwndC,  VideoAPI.WM_CAP_SAVEDIB,  0,  hBmp.ToInt32());
        }

         ///   <summary>   
        ///   开始录像
        ///   </summary>   
        ///   <param   name="path">要保存录像的路径</param>   
        public void StarKinescope(string path)
        {
            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
            VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt32());
            VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SEQUENCE, 0, 0);
        }
        ///  <summary>
        /// 停止录像
        ///  </summary>
        public void StopKinescope()
        {
            VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_START, 0, 0);

        }

    }
}

 

 

 

 

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace YangShi
{
       
   public class VideoAPI
    {
        //视频API调用

        //包含执行视频捕获的函数,给AVI文件的I/O处理和视频,音频设备驱动程序提供一个高级接口
        [DllImport("avicap32.dll")] 
        
        // 该函数用于创建一个视频捕获窗口 
        // 参数:标识窗口的名称,标识窗口风格,(X、Y标识窗口的左上角坐标),标识窗口的宽度和高度,标识父窗体句柄,标识窗口ID。
        // 返回视频捕捉窗口句柄
        public  static  extern  IntPtr  capCreateCaptureWindowA(byte[]  lpszWindowName,  int dwStyle,  int  x,  int  y,  int  nWidth,  int  nHeight,  IntPtr  hWndParent,  int  nID);
        [DllImport("avicap32.dll")]
        public  static  extern  bool  capGetDriverDescriptionA(short  wDriver,  byte[]  lpszName,  int  cbName,  byte[]  lpszVer,  int  cbVer);
       
       [DllImport("User32.dll")]
        //用于向Windows系统发送消息机制
        //参数:hWnd:窗口句柄,wMsg:将要发送的消息,wParam、IParam:消息的参数,每个消息都有两个参数,参数设置有发送消息而定
        public  static  extern  bool  SendMessage(IntPtr  hWnd,  int  wMsg,  bool  wParam,  int  lParam);
        [DllImport("User32.dll")]
        public  static  extern  bool  SendMessage(IntPtr  hWnd,  int  wMsg,  short  wParam,  int  lParam);
       //  常量
        public const int WM_USER = 0x400;  //16进制数  0x400=16^2乘以4=1024(十进制) 0x是16进制的前缀

        public  const  int  WS_CHILD  =  0x40000000; 
        public  const  int  WS_VISIBLE  =  0x10000000;
        public  const  int  SWP_NOMOVE  =  0x2;
        public  const  int  SWP_NOZORDER  =  0x4;
        public  const  int  WM_CAP_DRIVER_CONNECT  =  WM_USER  +  10;
        public  const  int  WM_CAP_DRIVER_DISCONNECT  =  WM_USER  +  11;
        public  const  int  WM_CAP_SET_CALLBACK_FRAME  =  WM_USER  +  5;
        public  const  int  WM_CAP_SET_PREVIEW  =  WM_USER  +  50;
        public  const  int  WM_CAP_SET_PREVIEWRATE  =  WM_USER  +  52;
        public  const  int  WM_CAP_SET_VIDEOFORMAT  =  WM_USER  +  45;
        public  const  int  WM_CAP_START  =  WM_USER;
        public  const  int  WM_CAP_SAVEDIB = WM_CAP_START + 25;

       
        //视频录像变量
        public  const  int WM_CAP_SEQUENCE = WM_CAP_START + 62;
        public  const  int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;

   
    }
}

 

 

 

 

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace YangShi
{
    public partial class ShiPin : Form
    {
        public ShiPin()
        {
            InitializeComponent();
        }
        cVideo video = null;
        //开始录像
        private void button1_Click(object sender, EventArgs e)
        {
            btnPlay.Enabled  =  false;
            btnStop.Enabled  =  true;
            btnPz.Enabled  =  true;
            video  =  new  cVideo(pictureBox1.Handle,  pictureBox1.Width,  pictureBox1.Height);
            video.StartWebCam();
            video.StarKinescope(@"d:\lx.avi");
        }

        //暂停录像
        private void btnStop_Click(object sender, EventArgs e)
        {
            btnPlay.Enabled  =  true;
            btnStop.Enabled  =  false;
            btnPz.Enabled  =  false;
            video.CloseWebcam();
            video.StopKinescope();
        }

        //拍照
        private void btnPz_Click(object sender, EventArgs e)
        {
            video.GrabImage(pictureBox1.Handle, "d:\\a.bmp");
        }

        //关闭系统
        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }

      

    }
}