求同时控制多个摄像头方法及其代码 下载Afoge.net,里面有个two camera test,你依葫芦画瓢就可以控制多个了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 具体的说是这样的通过这句发送的 SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, nCameraID, 0 我的两个usb口连着两个摄像头 我改成SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, 0, 0 程序捕捉的是默认的,但是 我改成SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, 1, 0 程序却捕捉不到另一个设备,不知道怎么弄? 这个方法,如果是连接到电脑的免驱动摄像头,不能打开摄像头。使用directShow最好。http://download.csdn.net/detail/mjp1234airen4385/3607954看看这个类库,你能不能用 就是同时打开两个摄像头,进行录像功能,我要怎么控制打开指定的摄像头如果你只要控制2个摄像头,并且要指定,我上面所得Aforge.net解决你的问题妥妥的。至于楼上说的Afoge.net控制多个摄像头会卡,但可能控制的比较多。2个的话肯定没问题。 至于代码 ,等你下载好后 ,示例程序里的代码你基本只要会复制粘贴即可 就是同时打开两个摄像头,进行录像功能,我要怎么控制打开指定的摄像头如果你只要控制2个摄像头,并且要指定,我上面所得Aforge.net解决你的问题妥妥的。至于楼上说的Afoge.net控制多个摄像头会卡,但可能控制的比较多。2个的话肯定没问题。 至于代码 ,等你下载好后 ,示例程序里的代码你基本只要会复制粘贴即可其实我最终的目的还是做一个可以添加多个摄像头的系统,但也很感谢你的回答! panle1控件对应摄像头0,panle2对应的是摄像头1,打开摄像头0时显示在panle1,当同时打开摄像头1时,panle1中的摄像头0黑了,panle2正常显示摄像头1,这是为什么,难道是要用多线程还是怎样,就大神指点。。 public partial class Form1 : Form { /// <summary> /// 获取系统安装的摄像头列表 /// </summary> /// <returns>返回格式:0|USB视频设备|1|USB摄像头,其中0或1是摄像头ID</returns> [DllImport("VedioCapture.dll")] private extern static string GetCameraList(); /// <summary> /// 设置打开的摄像头ID /// </summary> /// <param name="value">GetCameraList中列举的摄像头ID</param> /// <returns>返回0,设置成功</returns> [DllImport("VedioCapture.dll")] private extern static int SetCameraID(int value); /// <summary> /// 打开SetCameraID中设置的摄像头 /// </summary> /// <param name="Handle">要显示视频的控件</param> /// <returns>摄像头句柄</returns> [DllImport("VedioCapture.dll")] private extern static IntPtr StartCamera(IntPtr Handle); /// <summary> /// 关闭摄像头 /// </summary> /// <param name="hWndC">摄像头句柄</param> /// <returns>返回0,设置成功</returns> [DllImport("VedioCapture.dll")] private extern static int CloseCamera(IntPtr hWndC); /// <summary> /// 截取BMP格式的视频图像 /// </summary> /// <param name="hWndC">摄像头句柄</param> /// <param name="cFileName">截取的bmp文件名,或则-1(代表内存图片)</param> /// <returns>如果cFileName传入文件名,返回0,截取成功;如果cFileName传入-1,返回bmp图片的句柄(请使用后注意释放)</returns> [DllImport("VedioCapture.dll")] private extern static int SaveBmp(IntPtr hWndC, string cFileName); /// <summary> /// 开始录制视频 /// </summary> /// <param name="hWndC">摄像头句柄</param> /// <param name="cFileName">视频文件名</param> /// <returns>返回0,开始录制</returns> [DllImport("VedioCapture.dll")] private extern static int RecordVideo(IntPtr hWndC, string cFileName); /// <summary> /// 停止录制视频 /// </summary> /// <param name="hWndC">摄像头句柄</param> /// <returns>返回0,停止成功</returns> [DllImport("VedioCapture.dll")] private extern static int StopRecord(IntPtr hWndC); /// <summary> /// 将现有的图片文件制作成视频,仅支持bmp和jpg格式的图片 /// </summary> /// <param name="cPath">图片文件所在路径,以/结尾</param> /// <param name="cFileName">制作后的视频文件名</param> /// <param name="cFileType">图片类型:jpg或bmp</param> /// <param name="FrameRate">视频写入帧率,摄像头常用15帧,</param> /// <returns>返回0,制作成功</returns> [DllImport("VedioCapture.dll")] private extern static int CreateVideoByFiles(string cPath, string cFileName, string cFileType, int FrameRate); string AppPath = ""; public Form1() { InitializeComponent(); AppPath = Application.StartupPath + "\\"; } IntPtr camerah1 = IntPtr.Zero; IntPtr camerah2 = IntPtr.Zero; private void button1_Click(object sender, EventArgs e) { if (button1.Text == "开始") { SetCameraID(0); camerah1=StartCamera(panel1.Handle); button1.Text = "停止"; } else { CloseCamera(camerah1); button1.Text = "开始"; } } private void button2_Click(object sender, EventArgs e) { if (button2.Text == "开始") { SetCameraID(1); camerah2= StartCamera(panel2.Handle); button2.Text = "停止"; } else { CloseCamera(camerah2); button2.Text = "开始"; } } private void button5_Click(object sender, EventArgs e) { if (camerah1 != IntPtr.Zero) { //传入文件路径 SaveBmp(camerah1, AppPath + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp"); //传入-1,返回内存图片 IntPtr iptr = (IntPtr)SaveBmp(camerah1, "-1"); Bitmap bmp = Bitmap.FromHbitmap(iptr); bmp.Save(AppPath + "1号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp"); bmp.Dispose(); } } private void button6_Click(object sender, EventArgs e) { if (button6.Text == "录像") { if (camerah1 != IntPtr.Zero) { button6.Text = "停止"; RecordVideo(camerah1, AppPath + "1号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi"); } } else { if (camerah1 != IntPtr.Zero) { StopRecord(camerah1); button6.Text = "录像"; } } } private void button7_Click(object sender, EventArgs e) { if (camerah2 != IntPtr.Zero) { //传入文件路径 SaveBmp(camerah2, AppPath + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp"); //传入-1,返回内存图片 IntPtr iptr = (IntPtr)SaveBmp(camerah2, "-1"); Bitmap bmp = Bitmap.FromHbitmap(iptr); bmp.Save(AppPath + "2号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp"); bmp.Dispose(); } } private void button8_Click(object sender, EventArgs e) { if (button8.Text == "录像") { if (camerah2 != IntPtr.Zero) { button8.Text = "停止"; RecordVideo(camerah2, AppPath + "2号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi"); } } else { if (camerah2 != IntPtr.Zero) { StopRecord(camerah2); button8.Text = "录像"; } } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("确实要退出系统吗?", "系统", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { this.Dispose(); Application.Exit(); } else { e.Cancel = true; } }这是我的代码 并且我录制的时候录制的文件是OKB,你说的那个东西我也安装了,不知道为什么 我这里也没有两个摄像头,在C#示例里有多线程调用方式,你试试看。调用dll,dll内部记录了显示面板的句柄 Aforge 提供了2种 录像的方法 你的摄像头是什么摄像头,是专业开发的摄像头还是普通直接插上能被Windows识别的摄像头,前者是调用厂家提供的DLL,后者也就是用Windows的技术DirectShow,有一些成熟的类库帮你封装成.NET版了,上面提到的AForge就是一个很好的库。 我看你用的是VedioCapture.dll,这是什么DLL? 看你用的“SendMessage”,这不是avicap32.DLL吗?它确实只能捕获一个摄像头(据同事使用)。 [email protected] 感谢了!!! C#正则表达式的问题 简单正则表达式的怪问题 C# WinForm 方面的奇怪问题 菜鸟的问题 如何捕捉WebBrowser控件中某下拉列表框的事件啊?需要C#的例子。 抽取网页内容的算法 C# 请高手帮下忙 drawstring怎么绘制CM² 14001错误,应用程序配置不正确,重新安装可能解决这个问题 如何将下面的东西替换掉——正则表达式 我想定义float变量定义不了。 WINFORM 自己写的全屏事件 有办法避免全屏的过程中窗体闪烁吗?
通过这句发送的 SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, nCameraID, 0
我的两个usb口连着两个摄像头 我改成SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, 0, 0 程序捕捉的是默认的,但是 我改成SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, 1, 0 程序却捕捉不到另一个设备,不知道怎么弄?
使用directShow最好。
http://download.csdn.net/detail/mjp1234airen4385/3607954
看看这个类库,你能不能用
其实我最终的目的还是做一个可以添加多个摄像头的系统,但也很感谢你的回答!
{
/// <summary>
/// 获取系统安装的摄像头列表
/// </summary>
/// <returns>返回格式:0|USB视频设备|1|USB摄像头,其中0或1是摄像头ID</returns>
[DllImport("VedioCapture.dll")]
private extern static string GetCameraList();
/// <summary>
/// 设置打开的摄像头ID
/// </summary>
/// <param name="value">GetCameraList中列举的摄像头ID</param>
/// <returns>返回0,设置成功</returns>
[DllImport("VedioCapture.dll")]
private extern static int SetCameraID(int value);
/// <summary>
/// 打开SetCameraID中设置的摄像头
/// </summary>
/// <param name="Handle">要显示视频的控件</param>
/// <returns>摄像头句柄</returns>
[DllImport("VedioCapture.dll")]
private extern static IntPtr StartCamera(IntPtr Handle);
/// <summary>
/// 关闭摄像头
/// </summary>
/// <param name="hWndC">摄像头句柄</param>
/// <returns>返回0,设置成功</returns>
[DllImport("VedioCapture.dll")]
private extern static int CloseCamera(IntPtr hWndC);
/// <summary>
/// 截取BMP格式的视频图像
/// </summary>
/// <param name="hWndC">摄像头句柄</param>
/// <param name="cFileName">截取的bmp文件名,或则-1(代表内存图片)</param>
/// <returns>如果cFileName传入文件名,返回0,截取成功;如果cFileName传入-1,返回bmp图片的句柄(请使用后注意释放)</returns>
[DllImport("VedioCapture.dll")]
private extern static int SaveBmp(IntPtr hWndC, string cFileName);
/// <summary>
/// 开始录制视频
/// </summary>
/// <param name="hWndC">摄像头句柄</param>
/// <param name="cFileName">视频文件名</param>
/// <returns>返回0,开始录制</returns>
[DllImport("VedioCapture.dll")]
private extern static int RecordVideo(IntPtr hWndC, string cFileName);
/// <summary>
/// 停止录制视频
/// </summary>
/// <param name="hWndC">摄像头句柄</param>
/// <returns>返回0,停止成功</returns>
[DllImport("VedioCapture.dll")]
private extern static int StopRecord(IntPtr hWndC);
/// <summary>
/// 将现有的图片文件制作成视频,仅支持bmp和jpg格式的图片
/// </summary>
/// <param name="cPath">图片文件所在路径,以/结尾</param>
/// <param name="cFileName">制作后的视频文件名</param>
/// <param name="cFileType">图片类型:jpg或bmp</param>
/// <param name="FrameRate">视频写入帧率,摄像头常用15帧,</param>
/// <returns>返回0,制作成功</returns>
[DllImport("VedioCapture.dll")]
private extern static int CreateVideoByFiles(string cPath, string cFileName, string cFileType, int FrameRate);
string AppPath = "";
public Form1()
{
InitializeComponent();
AppPath = Application.StartupPath + "\\";
}
IntPtr camerah1 = IntPtr.Zero;
IntPtr camerah2 = IntPtr.Zero;
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "开始")
{
SetCameraID(0);
camerah1=StartCamera(panel1.Handle);
button1.Text = "停止";
}
else
{
CloseCamera(camerah1);
button1.Text = "开始";
} } private void button2_Click(object sender, EventArgs e)
{
if (button2.Text == "开始")
{
SetCameraID(1);
camerah2= StartCamera(panel2.Handle);
button2.Text = "停止";
}
else
{
CloseCamera(camerah2);
button2.Text = "开始";
} } private void button5_Click(object sender, EventArgs e)
{
if (camerah1 != IntPtr.Zero)
{
//传入文件路径
SaveBmp(camerah1, AppPath + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp");
//传入-1,返回内存图片
IntPtr iptr = (IntPtr)SaveBmp(camerah1, "-1");
Bitmap bmp = Bitmap.FromHbitmap(iptr);
bmp.Save(AppPath + "1号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp");
bmp.Dispose();
}
} private void button6_Click(object sender, EventArgs e)
{
if (button6.Text == "录像")
{
if (camerah1 != IntPtr.Zero)
{
button6.Text = "停止";
RecordVideo(camerah1, AppPath + "1号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi");
}
}
else
{
if (camerah1 != IntPtr.Zero)
{
StopRecord(camerah1);
button6.Text = "录像";
}
}
} private void button7_Click(object sender, EventArgs e)
{
if (camerah2 != IntPtr.Zero)
{
//传入文件路径
SaveBmp(camerah2, AppPath + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp");
//传入-1,返回内存图片
IntPtr iptr = (IntPtr)SaveBmp(camerah2, "-1");
Bitmap bmp = Bitmap.FromHbitmap(iptr);
bmp.Save(AppPath + "2号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp");
bmp.Dispose();
}
} private void button8_Click(object sender, EventArgs e)
{
if (button8.Text == "录像")
{
if (camerah2 != IntPtr.Zero)
{
button8.Text = "停止";
RecordVideo(camerah2, AppPath + "2号" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi");
}
}
else
{
if (camerah2 != IntPtr.Zero)
{
StopRecord(camerah2);
button8.Text = "录像";
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("确实要退出系统吗?", "系统", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{ this.Dispose();
Application.Exit();
}
else
{
e.Cancel = true;
}
}
这是我的代码
调用dll,dll内部记录了显示面板的句柄
Aforge 提供了2种 录像的方法