C# 如何选择指定的摄像头

问题描述

大家好,最近一直在做一个网络视频的项目,所以找了Gowk的代码经过分析和试验,Gowk网络语音视频代码可以实现,但是总觉得有点不太稳定现在遇到一个问题,困扰了我很久,希望各位能够帮助解决,我把最后的一百分贡献出来了就是当我拥有1个以上的视频设备的时候,假设一个设备为A,另外一个为B但程序枚举设备时,只显示MicrosoftWDMImageCapture(Win32),点击“属性”按钮的时候,也就是执行publicintShowVideoSource(){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_DLG_VIDEOSOURCE,0,0);}这个方法的时候,弹出一个属性框在里面可以看到A,B的名称,并可以进行选择因为默认是先显示A设备,如果我想用B设备,还必须弹出属性窗口后,选择B设备后才可以,很麻烦我想做的就是,我不想弹出属性框进行AB设备的选择,因为属性框是系统弹出的,我不能控制怎么样才能在代码里实现,我想选那个设备,就选那个设备呢,谢谢大家了代码太长贴出主要部分publicdelegatevoidVideoCaptureEventHandler(objectsender,VIDEOHDRhdr);publicdelegatevoidVideoErrorEventHandler(objectsender,stringdesc);publicclassVideoCapturer{capVideoStreamCallbackm_streamCallBack;capErrorCallbackm_errorCallBack;CaptureParmsm_parms;BITMAPINFOm_BITMAPINFO;IntPtrm_hwnd;boolm_IsCapturing;boolm_HasPreview;boolm_Connected;privateintindex;publiceventVideoCaptureEventHandlerVideoCaptured;publiceventVideoErrorEventHandlerVideoError;//intm_NumberFramesPerSecond=66;publicVideoCapturer(Controlcontrol,intindex){this.index=index;m_hwnd=capCreateCaptureWindow("",WS_VISIBLE|WS_CHILD,0,0,160,120,control.Handle,0);if(m_hwnd==IntPtr.Zero)thrownewMultimediaException();m_parms=newCaptureParms();m_streamCallBack=newcapVideoStreamCallback(this.streamCallBack);m_errorCallBack=newcapErrorCallback(this.capErrorCallback);SendMessage(m_hwnd,WM_CAP_SET_CALLBACK_ERRORA,0,m_errorCallBack);SendMessage(m_hwnd,WM_CAP_SET_CALLBACK_VIDEOSTREAM,0,m_streamCallBack);}publicintShowVideoDisplay(){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_DLG_VIDEODISPLAY,0,0);}publicintShowVideoCompression(){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_DLG_VIDEOCOMPRESSION,0,0);}publicintShowVideoFormat(){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_DLG_VIDEOFORMAT,0,0);}publicintShowVideoSource(){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_DLG_VIDEOSOURCE,0,0);}publicintConnectDevice(){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_DRIVER_CONNECT,this.index,0);}publicintSetPreviewRate(intrate){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_SET_PREVIEWRATE,rate,0);}publicboolPreview{get{returnthis.m_HasPreview;}set{intret=SendMessageClass.SendMessage(m_hwnd,WM_CAP_SET_PREVIEW,value,0);if(ret==1)this.m_HasPreview=value;}}publicintCaptureWithOutFile(){//Debug.Assert(this.Connected);intret=SendMessageClass.SendMessage(m_hwnd,WM_CAP_SEQUENCE_NOFILE,0,0);returnret;}publicvoidDisconnect(){SendMessageClass.SendMessage(m_hwnd,WM_CAP_DRIVER_DISCONNECT,0,0);}publicvoidClose(){SendMessageClass.SendMessage(m_hwnd,0x10,0,0);}publicintStop(){intret=SendMessageClass.SendMessage(m_hwnd,WM_CAP_STOP,0,0);returnret;}publicintAbort(){intret=SendMessageClass.SendMessage(m_hwnd,WM_CAP_ABORT,0,0);returnret;}publicintSavePicture(stringfile){returnSendMessage(m_hwnd,WM_CAP_FILE_SAVEDIBW,0,file);}publicCaptureParmsCaptureParms{get{SendMessage(m_hwnd,WM_CAP_GET_SEQUENCE_SETUP,Marshal.SizeOf(m_parms),refm_parms);returnthis.m_parms;}set{m_parms=value;SendMessage(m_hwnd,WM_CAP_SET_SEQUENCE_SETUP,Marshal.SizeOf(m_parms),refm_parms);}}publicBITMAPINFOBITMAPINFO{get{SendMessage(m_hwnd,WM_CAP_GET_VIDEOFORMAT,Marshal.SizeOf(m_BITMAPINFO),refm_BITMAPINFO);returnthis.m_BITMAPINFO;}set{this.m_BITMAPINFO=value;SendMessage(m_hwnd,WM_CAP_SET_VIDEOFORMAT,Marshal.SizeOf(m_BITMAPINFO),refm_BITMAPINFO);}}publicintSetScale(boolvalue){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_SET_SCALE,value,0);}publicCAPSTATUSCAPSTATUS{get{CAPSTATUSstatus=newCAPSTATUS();SendMessage(m_hwnd,WM_CAP_GET_STATUS,Marshal.SizeOf(CAPSTATUS),refstatus);returnstatus;}}publicboolConnected{get{returnthis.m_Connected;}}publicIntPtrHandler{get{returnthis.Handler;}}publicboolIsCapturing{get{returnthis.m_IsCapturing;}}/*publicintNumberFramesPerSecond{get{returnthis.m_NumberFramesPerSecond;}set{Debug.Assert(value>0&&value<10000);}}*/privateintstreamCallBack(IntPtrhWnd,refVIDEOHDRlpVHdr){if(this.VideoCaptured!=null)this.VideoCaptured(this,lpVHdr);return0;}privateintcapErrorCallback(IntPtrhWnd,intnID,stringlpsz){this.m_IsCapturing=false;this.m_HasPreview=false;if(this.m_Connected){this.Disconnect();this.m_Connected=false;}if(this.VideoError!=null)this.VideoError(this,lpsz);return0;}publicclassVideoCaptureDeviceCollection:System.Collections.ArrayList{}publicstaticVideoCaptureDeviceCollectionGetDevices(){VideoCaptureDeviceCollectionc=newVideoCaptureDeviceCollection();for(inti=0;i<10;i++){StringBuildername,version;name=newStringBuilder(128);version=newStringBuilder(128);if(capGetDriverDescription(i,name,128,version,128)){c.Add(newVideoCaptureDevice(i,name.ToString(),version.ToString()));}}returnc;}

解决方案

解决方案二:
用C#麻烦,用C++吧
解决方案三:
唉,用了C#2年多,总感觉C#弱弱的,疯掉了,我也想用C++,可我现在就会C#希望有高人指点一下这个问题啊
解决方案四:
:)-
解决方案五:
jf,
解决方案六:
我没分了,最后一百分了,拜托大家了,没人知道么?在线等
解决方案七:
好像不好搞,至少没搞过这方面的东东!不好意思了,帮你顶西呕!
解决方案八:
这个问题是不是不好弄啊,大家不要详细的告诉我,只需要告诉我应该改那个参数就可以了比如我试过,publicintConnectDevice(){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_DRIVER_CONNECT,this.index,0);}把这方法的最后一个参数改为1publicintConnectDevice(){returnSendMessageClass.SendMessage(m_hwnd,WM_CAP_DRIVER_CONNECT,this.index,1);}也没用,估计还是没有改对地方希望高手指点,不需要详细过程,就需要告诉我应该改什么地方就好了
解决方案九:
虽然不知道怎么样,但还是帮你顶一下,呵呵...
解决方案十:
楼主代码很强,那么长,愣是没有一个注释
解决方案十一:
没摄相头了,没试过。帮顶。
解决方案十二:
呵呵,没有人知道么?伤心了
解决方案十三:
顶!!支持楼主!!共同学习,共同进步!
解决方案十四:
引用9楼wisdomqq的回复:

楼主代码很强,那么长,愣是没有一个注释

帮顶
解决方案十五:
<C#开发经验技巧宝曲>VFW开发里有介绍,去看一下这本书
解决方案:
该回复于2008-05-05 16:53:22被版主删除
解决方案:
晕,解释一下,呵呵,这不是我的代码哦,是Gowk的,我写的程序基本是一句代码,一句注释,良好的编成习惯,对开发也有很大的帮助,没有注释,是因为我还没有完全理解Gowk的代码,所以没加呵呵,唉,这个那么难么?都没人会,看来得另想办法了

时间: 2024-09-27 17:15:51

C# 如何选择指定的摄像头的相关文章

Android系统控制连接usb外部存储设备的代码在哪里能找到,我想在其中增加一个选择指定设备的功能

问题描述 Android系统控制连接usb外部存储设备的代码在哪里能找到,我想在其中增加一个选择指定设备的功能 代码指的是系统代码,Android系统支持USBhost功能.当u盘插在手机上时,系统自动甄别其是否为指定外设,如果是,没有额外动作,一切如常:如果不是,系统自动移除外设:楼主是Android新手,希望大家给予些帮助或思路

delphi rave分页打印-Delphi rave如何选择指定页打印

问题描述 Delphi rave如何选择指定页打印 Delphi rave如何选择指定页打印,打印预览的时候选择了打印2到2,或3到4,但总是从第一页开始打印,请问各位大侠,怎么解决,谢谢! 解决方案 http://wenku.baidu.com/link?url=1otOFkPvTGSDeSQh_4VPoViaYHvkkZuGFLawLBTp2N1vc5XFpMbnz96FCjqBb4BREHFFjyPT7UKY5KBaOvAXQV1mXuOdK-9nGYnGHilSW9S 解决方案二: 按照

如何 在Access中选择指定日期前的记录?_Access

我知道,在Access中不能使用DateDiff,那么我们怎样才能选择指定日期前的若干记录呢?   虽然在Access中不能使用DateDiff函数,但我们可以使用日期函数来实现这一功能.看看下面这个"庞大"的示例,就是实现如何选择前8个包括今天及今天以前的日期的记录的语句:   select TOP 3 * from mytable where ((YEAR(ndate)<"&year(now)&") or (YEAR(ndate)=&quo

javascript选择指定checkbox,select,Radio值代码

javascript选择指定checkbox,select,radio值代码 function selectcheckbox(name,value) {  var checkobject = document.getelementsbyname(name);  var valuevalues = value.split(",");  for(var j = 0; j < values.length; j++)  {   for (var i = 0; i < checkob

打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机

如果一台电脑同时连接多个打印机,而且每个打印机使用的纸张大小各不相同(比如:票据打印钱用的小票专用张,办公打印机用的是A4标准纸),在处理打印类的需求时,如果不用代码干预,用户必须每次打印时,都必须在弹出窗口里,手动选择打印机(还有可能需要设置纸张类型),这样用起来会比较烦. 幸好,.Net提供了"二"个很有用的类:PrintDialog(打印机设置对话框).PageSetupDialog(页面设置对话框) (注:之所以给"二"加引号,是因为"打印机设置&

摄像头保护 程序~~,类似于360的那种,不过是需要只要是调用摄像头使用时,就要弹框,选择是否启用摄像头~~至于密码功能就不劳烦大家了~~

问题描述 具体点就是每当使用摄像头的时候(比如使用QQ视频啊,QQ视频斗地主之类的),就会弹框提示选择,并可以输入密码(这个可以自己做),然后当确定后才能使用摄像头,否则不能使用摄像头,好了,大概描述清楚了,急求啊,网上c#似乎没有办法接触到底层,我对于硬件底层的编码不大了解,最好是c#,其他的java什么的也行~~ 解决方案 解决方案二:这种程序最好用c来写,涉及底层的,c#不合适,解决方案三:引用1楼stonespace的回复: 这种程序最好用c来写,涉及底层的,c#不合适, +1.C#不适

选择指定数量后checkbox不可选(变灰)javascript代码_javascript技巧

选择3个后可以看到效果 粤菜 潮州 客家 川菜 上海/江浙 湖南 湖北 贵州 东北 江西 北京 鲁菜 台湾 新疆/清真 云南 其他中餐 野味 火锅 海鲜 比萨 自助餐 茶餐厅 小吃面食 烧烤 素菜 简餐 快餐 面包糕点 甜品 茶室 咖啡厅 酒吧 日本 韩国 东南亚印 法国 意大利 拉美 无国界 西餐 其他西餐 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

WordPress选择指定物件防垃圾评论插件Fancy Captcha安装和设置

到目前为止,老蒋已经整理了mini-capatcha.myQaptcha,以及WordPress程序自身带的防垃圾评论插件功能.还有一种类似的功能我们肯定经常有遇到过,比如在12306买票的时候,那选择物件的防作弊功能尤为让人讨厌是吧?但是这种方式是较为严格且能着实的防止软件评论的.   不过,今天老蒋要分享的这款Fancy Captcha插件没有12306上面的复杂,但也可以通过用户选择对应的物件来起到防止垃圾评论的功能,我们也经常在个人博客中有看到过,所以在这里老蒋再分享这个Fancy Ca

浅谈WinCE平台USB摄像头驱动开发流程

由于良好的性能.低廉的价格和灵活方便的特性,USB 摄像头正被广泛的集成到嵌入式系统中.例如,通过USB 摄像头WinCE系统可以很方便地得到实时图像,这对某些要求实时图象监控的嵌入式系统是一个很不错的选择.但是由于嵌入式硬件平台的多样性,以及WinCE对USB设备驱动开发只提供了底层支持,再加上许多摄像头厂商尚未提供WinCE下的USB摄像头驱动,这对初级开发人员在开发WinCE USB摄像头程序时是一个难点.     前段时间,公司委派我负责一个嵌入式项目,项目要求是在WinCE平台上集成U