es_Size End Enum
'捕捉文件和缓存
Const WM_Cap_File_Set_File = WM_User + 20 '设置当前的捕捉文件 Const WM_Cap_File_Get_File = WM_User + 21 '得到当前的捕捉文件
Const WM_CAP_FILE_ALLOCATE = WM_User + 22 '为捕捉文件预分配空间,从而可以减少被漏掉的帧
Const WM_CAP_FILE_SaveAs = WM_User + 23 '将捕捉文件保存为另一个用户指定的文件。这个消息不会改变捕捉文件的名字和内容,
'由于捕捉文件保留它最初的文件名,因此必须指定个新的文件的文件名来保存
Const WM_CAP_FILE_SET_INFOCHUNK = WM_User + 24 '可以把信息块例如文本或者自定义数据插入avi文件。同样用这个消息也可以清除avi文件中的信息块
Const WM_CAP_FILE_SaveDIB = WM_User + 25 '把从帧缓存中复制出图像存为设备无关位图书馆(DIB),应用程序也可以使用这两个单帧捕捉消息来编辑帧序列,
'或者创建一个慢速摄影序列
Const WM_CAP_Edit_Copy = WM_User + 30 '1054:把缓存中图像复制到剪贴板中
Const WM_CAP_SET_AUDIOFORMAT = WM_User + 35 '设置音频格式。设置时传入一个WAVEFORMAT、WAVEFORMATEX、或PCMWAVEOFMAT结构的指针
Const WM_CAP_GET_AUDIOFORMAT = WM_User + 36 '来得到音频数据的格式和该格式结构体的大小。默认的捕捉音频格式是mono、8-bit和11kHZ PCM
Const WM_CAP_Get_VideoFormat = WM_User + 44 '给捕捉窗口来得到视频格式的结构和该结构的大小。
Const WM_CAP_SET_VideoFormat = WM_User + 45 '用来设置视频格式
Const WM_CAP_SET_PreView = WM_User + 50 '发送给捕捉窗口来使预览模式有效或者失效 Const WM_CAP_SET_Overlay = WM_User + 51 '使窗口处于叠加模式。使叠加模式有效也会自动地使预览模式失效
Const WM_CAP_SET_PreViewRate = WM_User + 52 '发送给捕捉窗口来设置在预览模式下帧的显示频率
Const WM_CAP_SET_Scale = WM_User + 53 '来使预览模式的缩放有效或者无效
Const WM_CAP_SET_SCROLL = WM_User + 55 '如果是在预览模式或者叠加模式,还可以通过本消息发送给窗口,
'在窗口里的用户区域设置视频帧的滚动条的位置 Private Type BitMapInfoHeader 'tagBitMapInfoHeader Structure biSize As Long ' biWidth As Long
biHeight As Long 'LONG DWORD biPlanes As Integer 'WORD biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type
Private Type BitMapInfo
bmiHeader As BitMapInfoHeader ' bmiColors As Byte 'RGBQUAD End Type
'基本视频捕获消息--------------------------------------
Const WM_CAP_Connect = WM_User + 10 '连接一个视频驱动,成功返回真(1)。连接驱动后,不一定就能显示视频,还要保证摄像头硬件连接良好、未被其他程序使用。
Const WM_CAP_DisConnect = WM_User + 11 '断开视频窗口与驱动的连接
' wParam:视频设备序号,从 0 到 9
Const WM_CAP_Sequence = WM_User + 62 '开始录像 Const WM_CAP_Stop = WM_User + 68 '终止视频捕获
Const WM_CAP_Abort = WM_User + 69 '暂停录像捕获?,成功返回真 Const WM_CAP_Set_Sequence_Setup = WM_User + 64
Const WM_CAP_Get_Sequence_Setup = WM_User + 65
'录像参数设置和获取
'Dim nParms As CaptureParms
'SendMessage ctCapWin, WM_CAP_Get_Sequence_Setup, Len(nParms), nParms'获取参数的设置
'nParms.fAbortLeftMouse = False '关闭:单击鼠标停止录像的功能。
'SendMessage ctCapWin, WM_CAP_Set_Sequence_Setup, Len(nParms), nParms'重新设置参数
Private Type CaptureParms '
dwRequestMicroSecPerFrame As Long 'DWORD
fMakeUserHitOKToCapture As Boolean '开始录像时,是否显示确认对话框,默认为假 wPercentDropForError As Long '每毫秒捕捉帧率,默认66667,即每秒15帧 fYield As Boolean 'BOOL:如果为TRUE,将产生一个后台线程来进行视频捕捉 dwIndexSize As Long 'DWORD:视频文件最大的索引入口数 wChunkGranularity As Long 'UINT:以字节为单位表示AVI文件的大小 fUsingDOSMemory As Boolean 'BOOL:未使用
wNumVideoRequested As Long 'UINT:分配视频缓冲区的最大数量 fCaptureAudio As Boolean '是否捕获音频流,默认值由具体的硬件设置 wNumAudioRequested As Long '分配的音频缓冲区的最大数量
vKeyAbort As Long '结束录像的按键,默认为 VK_ESCAPE(Esc键) fAbortLeftMouse As Boolean '单击鼠标左键停止录像,默认为真 fAbortRightMouse As Boolean '单击鼠标右键停止录像,默认为假 fLimitEnabled As Boolean '是否开启捕获时间限制,默认为真
wTimeLimit As Long '捕获时间限制(秒),fLimitEnabled 为真时有效
fMCIControl As Boolean 'BOOL:为TRUE,控制MCI(媒体设备接口)兼容的视频源 fStepMCIDevice As Boolean 'BOOL
dwMCIStartTime As Long 'DWORD:以毫秒为单位标识MCI设备视频捕捉序列的起始位置,如果fMCIControl成员为FALSE,该成员被忽略
dwMCIStopTime As Long 'DWORD:以毫秒为单位标识MCI设备视频捕捉序列的停止位置,如果fMCIControl成员为FALSE,该成员被忽略
fStepCaptureAt2x As Boolean 'BOOL:为TRUE,捕捉的视频帧使用两个分辨率 wStepCaptureAverageFrames As Long ':在捕捉时每帧图像使用的时间大小
dwAudioBufferSize As Long '音频缓冲大小,默认0 fDisableWriteCache As Boolean 'Win32系统未使用
AVStreamMaster As Long '确定在写入AVI文件时,音频流是否控制时钟 End Type
'视频窗口消息--------------------------------------
'Private Declare Function capGetDriverDescriptionA Lib "avicap32.dll" ( _ 'ByVal wDriver As Integer, ByVal lpszName As String, ByVal cbName As Long, ByVal lpszVer As String, ByVal cbVer As Long) As Boolean
'可利用此 API 获取所有驱动程序名称和版本信息。例子: ' Dim S As Long
' Dim lpszName As String * 128 ' Dim lpszVer As String * 128 ' ' Do
' If Not capGetDriverDescriptionA(S, lpszName, 128, lpszVer, 128) Then Exit Do '获得驱动程序名称和版本信息
' S = S + 1 ' Loop
Const WM_CAP_Get_Status = WM_User + 54 '获取捕捉窗口的当前状态 Private Type CapStatus '■■?
uiImageWidth As Long '图像宽度,像素 uiImageHeight As Long '图像高度,像素 fLiveWindow As Boolean '视频显示是否使用预览 fOverlayWindow As Boolean '视频显示是否使用硬件 fScale As Boolean '图像是否随窗口大小自动缩放 ptScroll As PointAPI 'POINT?
fUsingDefaultPalette As Boolean '是否使用默认调色板 fAudioHardware As Boolean '是否安装了音频波形硬件 fCapFileExists As Boolean '是否生成了正确的捕获文件 dwCurrentVideoFrame As Long
dwCurrentVideoFramesDropped As Long dwCurrentWaveSamples As Long
dwCurrentTimeElapsedMS As Long '视频流已录像时间(毫秒) hPalCurrent As Long 'HPALETTE 当前调色板句柄 fCapturingNow As Boolean '是否正在进行捕获
dwReturn As Long '错误返回值,根据这个数值可以调用一个错误回调函数 wNumVideoAllocated As Long '视频缓冲 wNumAudioAllocated As Long '音频缓冲 End Type
Private Sub CloseMouse() Dim nParms As CaptureParms
SendMessage ctCapWin, WM_CAP_Get_Sequence_Setup, Len(nParms), nParms '获取参数的设置
'nParms.fMakeUserHitOKToCapture = True '开始录像时,是否显示确认对话框 nParms.fYield = True '用一个后台线程来进行视频捕捉
nParms.fAbortLeftMouse = False '关闭:单击鼠标左键停止录像的功能。 nParms.fAbortRightMouse = False '关闭:单击鼠标右键停止录像的功能
SendMessage ctCapWin, WM_CAP_Set_Sequence_Setup, Len(nParms), nParms '重新设置参数
'ff = SendMessageLong(ctCapWin, WM_CAP_SET_CALLBACK_STATUS, 0, AddressOf CallBackStatus) '状态回调函数
'ff = SendMessageLong(ctCapWin, WM_CAP_SET_CALLBACK_FRAME, 0, AddressOf MyFrameCallback) '帧回调函数
'ff = SendMessageLong(ctCapWin, WM_CAP_SET_CALLBACK_YIELD, 0, AddressOf CallbackYield)
End Sub
Private Sub NoRecord()
SendMessage ctCapWin, WM_CAP_Stop, 0, 0 '停止录像 ctRec = False: Call SetCaption(" ") End Sub
Private Sub StartRecord()
Dim F As String, nDir As String, nF As String