使用VFW写的C#控制摄像头最大的问题就在于需要自己手动另起一个线程。(这里,我们定义一个叫AviCapture.cs的类,用于引入avicap32.dll以及相关的内容)在avicap32.dll中,CAPTUREPARMS结构里有一个fYield的东东,代表的意思是另起线程标志位,如果为真,则程序重新启动一个线程用于视频流的捕获,默认值是假。但是如果你是为了真,你必须要在程序中处理一些潜在的操作,因为当视频捕获时,其他操作并没有被屏蔽。。在AviCapture这个类的基础上定义一个叫Video的类,实现控制设想头的一些方法,如打开摄像头,关闭摄像头,开始录像,结束录像,拍照片等等。。。。在Video类中还要定义两个C#控制摄像头函数如下:
- publicvoidget()
- {
- AviCapture.SendMessage(this.lwndC,AviCapture.WM_CAP_GET_SEQUENCE_SETUP,AviCapture.SizeOf(Capparms),refCapparms);
- }
- publicvoidset()
- {
- AviCapture.SendMessage(this.lwndC,AviCapture.WM_CAP_SET_SEQUENCE_SETUP,AviCapture.SizeOf(Capparms),refCapparms);
- }
用来获得和设置相关的C#控制摄像头参数
最后,在主窗体类中,做如下调用
- video.get();//
- video.Capparms.fYield=true;//另起一个线程
- video.Capparms.fAbortLeftMouse=false;//鼠标左键单击停止为false
- video.Capparms.fAbortRightMouse=false;//鼠标右键单击停止为false
- video.set();
在这里还有强调一下,上面的这段函数要用在视频预览函数之后(也就是打开摄像头那个函数),否则是不起作用的。
【编辑推荐】