从网上下了一个操作摄像头的类函数,不过在启动的时候,显示的的屏幕总是一片漆黑,并没有图像显示,有哪位高手知道什么原因啊,vs2008+windows7平台,并且从网上下的其他的代码试了,也不行,也显示的的是一片漆黑
解决方案 »
- 到底怎么才能给windows mobile下的listview控件添加背景呢?
- datetime中的类型转换问题
- 如何重载ComboBox 使其下拉按钮(带下箭头的)和下拉列表的垂直滚动条的宽度改变?
- 随机试卷
- winForm中DataGrid滚动条问题
- C# windows 编程中,只想把数据绑定到 DataGrid 控件上怎么就这么难啊
- 关于xml 多出xmlns=""
- C#中如何用WMI获取所有运行的应用程序状态
- 哪里出了问题,怎么读不出来,估计问题出在provider = SQLOLEDB;Integrated Security = SSPI;
- 关注Visual Sourcesafe,继续散分,刚才的300分大贴已经结完贴了,大家可以找一下自己的得分纪录:)
- c#与Flash交互
- 获取gridview值
{
//导入API函数
[DllImport("avicap32.dll")]
private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
[DllImport("avicap32.dll")]
private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
[DllImport("User32.dll")]
private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
//常量设置
private const int WM_USER = 0x400;
private const int WS_CHILD = 0x40000000;
private const int WS_VISIBLE = 0x10000000;
private const int WM_CAP_START = WM_USER;
private const int WM_CAP_STOP = WM_CAP_START + 68;
private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;
private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
private const int WM_CAP_SET_SCALE = WM_CAP_START + 53;
private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
private const int WM_CAP_FILE_SAVEAS = WM_CAP_START + 23; //将捕捉文件保存为另一个用户指定的文件。这个消息不会改变捕捉文件的名字和内容, //全局变量
private IntPtr hWndC; //句柄
private IntPtr mControlPtr; //句柄
private bool bWorkStart = false;
private int mWidth; //视频显示宽度
private int mHeight; //视频显示高度
private int mLeft; //视频显示左边距
private int mTop; //视频显示上边距
/// <summary>
/// 初始化显示图像
/// </summary>
/// <param name="handle">播放视频控件的句柄</param>
/// <param name="left">视频显示的左边距</param>
/// <param name="top">视频显示的上边距</param>
/// <param name="down">视频显示的下边距</param>
/// <param name="right">视频显示的右边距</param>
/// <param name="width">要显示视频的宽度</param>
/// <param name="height">要显示视频的长度</param>
public cVideo(IntPtr handle, int left, int top, int width, int height)
{
mControlPtr = handle;
mWidth = width;
mHeight = height;
mLeft = left;
mTop = top;
}
/// <summary>
/// 打开视频
/// </summary>
public void StartVideo()
{
if (bWorkStart)
return;
bWorkStart = true;
byte[] lpszName = new byte[100];
//创建播放窗口
hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0); if (hWndC.ToInt32() != 0)
{
//显示视频
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 100, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
}
}
/// <summary>
/// 关闭视频
/// </summary>
public void StopVideo()
{
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
bWorkStart = false;
} /// <summary>
/// 拍照
/// </summary>
/// <param name="path">文件路径</param>
public void Images(string path)
{
IntPtr imagePath = Marshal.StringToHGlobalAnsi(path);
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, imagePath.ToInt32());
} }以上为类代码
viodeo.StartWebCam();这种方法实现的视频,关键就是看你传输图片的效率,如果效率比较低下的话,你的视频就会很“卡”LZ自己慢慢去体会,并优化吧
一般的解决办法是使用DirectShow处理的。
这个类库给你。以前写的。可以抓图。
参考
必须使用DllImport的方式。
另外,我这个dll不带录制视频功能的。只有抓图的功能。
录制的功能也做过了,但是没有在dll里面。
录像的压缩也做了,录制完成也是avi格式的,使用的压缩技术是mp4的免费编码器。
效果也还行。就是不能提供给你。真是很遗憾的事情。
共有三个函数,以下以C++方式申明:
//打开摄像头,目前只支持单一摄像头的取值,如果系统连接多个摄像头,只能取其中的一个,不能指定摄像头。
//cTitle 传入 "";
//Left 是距显示视频控件的左边距,一般是0
//Top 是距显示视频控件的顶边距,一般是0
//Width 是在显示视频控件中视频的显示宽度
//Height 是在显示视频控件中视频的显示高度
//Handle 是在显示视频控件的句柄
//返回结果:打开摄像头的句柄。
__stdcall HWND StartCamera(const char* cTitle, int Left, int Top, int Width, int Height, HWND Handle);
//关闭摄像头。
//返回结果是否关闭。
__stdcall bool CloseCamera(HWND hWndC);
//截取图片
//hWndC,摄像头句柄。
//要保存的文件名
__stdcall bool SaveBmp(HWND hWndC, const char* cFileName);调用:
HWND HCamera = NULL;HCamera = StartCamera("", 0, 0, Control.Width, Control.Height, Control.Handle);//要等待摄像头打开,出现视频才可以抓图。
SaveBmp(HCamera, "C:\\TestCamera.Bmp");CloseCamera(HCamera);