用c#如何同时控制2个摄像头? 谢谢赐教

tongtianxiao 2010-04-27 06:56:23
用c#如何同时控制2个摄像头? 谢谢赐教

如下代码是控制一个摄像头的代码:

     public class VideoAPI  //视频API类
{
// 视频API调用
[DllImport("avicap32.dll")]
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")]
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;
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;
}

//class MzVideoClass
public class MzVideo //视频类
{
private IntPtr lwndC; //保存无符号句柄
private IntPtr mControlPtr; //保存管理指示器
private int mWidth;
private int mHeight;

public MzVideo(IntPtr handle, int width, int height)
{
mControlPtr = handle; //显示视频控件的句柄
mWidth = width; //视频宽度
mHeight = height; //视频高度
}
/// <summary>
/// 打开视频设备
/// </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 = Marshal.StringToHGlobalAnsi(path);
VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SAVEDIB, 0, hBmp.ToInt32());
}
}

//打开视频
private void button1_Click(object sender, EventArgs e)
{
MzVideo video = new MzVideo(pictureBox1.Handle, pictureBox1.Width, pictureBox1.Height);
video.StartWebCam();
}


那我现在有两个摄像头,如何同时打开呢?谢谢赐教
...全文
673 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
c65061362 2012-07-26
  • 打赏
  • 举报
回复
好人[Quote=引用 14 楼 的回复:]

查了一下应该是int nID 这个参数,这里标明设备编号,默认(建议)是0,是第一个摄像头,改成1的话应该可以开启第二个摄像头的视线,不能帮试原因一、公司电脑没有摄像头,原因二、因为穷家中只有1个摄像头。。。
[/Quote]
yb432706 2011-11-11
  • 打赏
  • 举报
回复
问一下,这个问题到现在还没有解吗?如果有解,请指点一下,告诉我是如何解的,最好能把解决的代码贴出来,这里先谢啦!
Hello_Wrorld_2010 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tongtianxiao 的回复:]
引用 14 楼 icdbow 的回复:
查了一下应该是int nID 这个参数,这里标明设备编号,默认(建议)是0,是第一个摄像头,改成1的话应该可以开启第二个摄像头的视线,不能帮试原因一、公司电脑没有摄像头,原因二、因为穷家中只有1个摄像头。。。


我把nID设置为1,运行后打开的依旧是第一个摄像头啊

继续讨教...谢谢
[/Quote]

最近我也碰到这个问题,帮顶。。。
rtz2003 2010-06-10
  • 打赏
  • 举报
回复
这个问题解决了吗?帮顶!
tongtianxiao 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 rtz2003 的回复:]
这个问题解决了吗?帮顶!
[/Quote]

这个问题没有解决呢
tongtianxiao 2010-04-29
  • 打赏
  • 举报
回复
继续讨教...谢谢
studentliudong 2010-04-28
  • 打赏
  • 举报
回复
学习下,帮楼主顶下~~
tongtianxiao 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 icdbow 的回复:]
查了一下应该是int nID 这个参数,这里标明设备编号,默认(建议)是0,是第一个摄像头,改成1的话应该可以开启第二个摄像头的视线,不能帮试原因一、公司电脑没有摄像头,原因二、因为穷家中只有1个摄像头。。。
[/Quote]

我把nID设置为1,运行后打开的依旧是第一个摄像头啊

继续讨教...谢谢
mayonglong 2010-04-28
  • 打赏
  • 举报
回复
收藏了~~~~
ljt_09 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lester19872007 的回复:]
可以采用多线程加窗口切分技术。。
[/Quote]
........
Code従業員 2010-04-28
  • 打赏
  • 举报
回复
查了一下应该是int nID 这个参数,这里标明设备编号,默认(建议)是0,是第一个摄像头,改成1的话应该可以开启第二个摄像头的视线,不能帮试原因一、公司电脑没有摄像头,原因二、因为穷家中只有1个摄像头。。。
Code従業員 2010-04-28
  • 打赏
  • 举报
回复
应该查看设备号,获取下一个设备的句柄,传入不同的句柄会有不同的结果。老实说avicap32.dll提供的方法我不是很清楚,需要查找下相关资料;一般来说插一个新硬件都会占用一个端口的,或许可以从端口处得到启示。。。
tongtianxiao 2010-04-28
  • 打赏
  • 举报
回复
up..............
April214841590 2010-04-27
  • 打赏
  • 举报
回复
学习中......
yufenghua 2010-04-27
  • 打赏
  • 举报
回复
一个我都没控制过 还来俩。。。帮顶
请叫我卷福 2010-04-27
  • 打赏
  • 举报
回复
帮LZ顶啊~~~~~ding
shashengduguzhe 2010-04-27
  • 打赏
  • 举报
回复
应该使用多线程解决就可以了。
Peter200694013 2010-04-27
  • 打赏
  • 举报
回复
study...
June1991 2010-04-27
  • 打赏
  • 举报
回复
学习。。
lester19872007 2010-04-27
  • 打赏
  • 举报
回复
可以采用多线程加窗口切分技术。。
加载更多回复(4)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧