标题:关于调用摄像头的问题
取消只看楼主
大树临风
Rank: 2
等 级:论坛游民
帖 子:128
专家分:14
注 册:2015-12-9
结帖率:80%
 问题点数:0 回复次数:1 
关于调用摄像头的问题
主程序int包含如下代码:
*--以下定义摄像头扩展应用:一般放到主程序或表单(集)的Load事件中
Public WM_CAP_DRIVER_DISCONNECT
Public hwndc,WM_CAP_SAVEDIB,WM_CAP_FILE_SET_CAPTURE_FILEA,WM_CAP_SEQUENCE,WM_CAP_STOP
Declare Integer capCreateCaptureWindowA In "AVICAP32.DLL" String lpszWindowName ,Integer dwStyle ,;
    Integer x, Integer Y, Integer nWidth ,Integer nHeight,Integer ParentWin,Integer nId
Declare Integer SendMessage In "user32" Integer HWnd, Integer wmsg,Integer wpar1, Integer wpar2
Declare Integer SendMessage In "user32" As SendMessageA Integer HWnd, Integer wmsg,Integer wpar1,String wpar2
hwndc=0
*--以上定义摄像头扩展应用:一般放到主程序或表单(集)的Load事件中

按钮“打开镜头”的click代码如下
*--显示:可以放到按钮或表单(集)的Init事件中,!!!
WM_USER = 1024
WM_CAP_START = WM_USER
WM_CAP_STOP = WM_CAP_START + 68
WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11

WM_CAP_SAVEDIB = WM_CAP_START + 25
WM_CAP_GRAB_FRAME = WM_CAP_START + 60
WM_CAP_SEQUENCE = WM_CAP_START + 62
WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20
WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63
WM_CAP_SET_OVERLAY =WM_CAP_START+ 51
WM_CAP_SET_PREVIEW =WM_CAP_START+ 50
WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6
WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2
WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3
WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5
WM_CAP_SET_SCALE=WM_CAP_START+ 53
WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52

*第3、4个参数是定义显示位置,第5、6个参数是定义显示大小。
hWndC = capCreateCaptureWindowA('My Own Capture Window',1342177280,100,100,320,240,Thisform.HWnd ,0)

If hWndC<>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)    &&设置回调状态,原始值为:0,0
    SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0)        &&驱动程序连接
    SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0)            &&设置预览视频的缩放比例
    SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0)    &&设置预览模式下图像的帧速度
    SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0)    &&设置覆盖
    SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0)    &&设置预览模式
ENDIF

&&问题:1、测试发现,这段if ...endif 必须连续的执行两次(如下),才能打开摄像头,如果不执行第二次,则弹出摄像头的选择确认窗口,选择确认后,摄像头打不开;
&&      2、如果有前、后两个摄像头,没有默认选择项(即必须在弹出的窗口中选择一个摄像头,然后确认),则执行第二次,同样打不开摄像头
&&       也就是说,一旦有摄像头选择的窗口弹出来,则后续就打不开摄像头了

If hWndC<>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)    &&设置回调状态,原始值为:0,0
    SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0)        &&驱动程序连接
    SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0)            &&设置预览视频的缩放比例
    SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0)    &&设置预览模式下图像的帧速度
    SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0)    &&设置覆盖
    SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0)    &&设置预览模式
ENDIF

thisform.关闭镜头.Enabled= .T.
thisform.录制视频.Enabled= .T.
thisform.拍照储存.Enabled= .T.
this.Enabled= .F.
搜索更多相关主题的帖子: 摄像头 Integer 视频 预览 选择 
2019-07-27 16:29
大树临风
Rank: 2
等 级:论坛游民
帖 子:128
专家分:14
注 册:2015-12-9
得分:0 
我发现,其实是需要执行两次驱动程序连接,并且要在有限的时间内关闭弹窗

SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0)        &&驱动程序连接
2019-07-27 19:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-496064-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042915 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved