VS2013调用摄像头录像问题

bg114 2018-09-07 10:25:41
用VS2013调用api进项摄像头的调用,显示和截图能能完成,但是只要录像就出现蓝屏,请教下怎么处理?
''' <summary>
''' 录像
''' </summary>
''' <param name="path">要保存avi文件的路径</param>
Public Sub 开始录像(path As String)
'AVICap默认,把音视频数据从捕获窗口保存到当前驱动得根目录下,文件名称为CAPTURE.AVI
Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp)
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0)
End Sub
每次运行到 SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0)就蓝屏


摄像头整个类如下:
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Drawing.Imaging
''' <summary>
''' 一个控制摄像头的类
''' </summary>
Public Class 摄像头
Private Const WM_USER As Integer = &H400 '用户消息开始号
Private Const WS_CHILD As Integer = &H40000000
Private Const WS_VISIBLE As Integer = &H10000000
Private Const WM_CAP_START As Integer = WM_USER
Private Const WM_CAP_UNICODE_START = WM_USER + 100 '开始
Private ConstWM_CAP_GET_CAPSTREAMPTR = (WM_CAP_START + 1) '获得 CAPSTR EAMPTR
Private Const WM_CAP_SET_CALLBACK_ERROR = (WM_CAP_START + 2) '设置回调错误
Private Const WM_CAP_SET_CALLBACK_STATUSA = (WM_CAP_START + 3) '设置回调状态
Private Const WM_CAP_SET_CALLBACK_YIELD = (WM_CAP_START + 4) '设置回调出产
Private Const WM_CAP_SET_CALLBACK_FRAME = (WM_CAP_START + 5) '设置回调结构
Private Const WM_CAP_SET_CALLBACK_VIDEOSTREAM = (WM_CAP_START + 6) '设置回调视频流
Private Const WM_CAP_SET_CALLBACK_WAVESTREAM = (WM_CAP_START + 7) '设置回调视频波流
Private Const WM_CAP_GET_USER_DATA = (WM_CAP_START + 8) '获得使用者数据
Private Const WM_CAP_SET_USER_DATA = (WM_CAP_START + 9) '设置使用者数据
Private Const WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10) '驱动程序连接
Private Const WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11) '断开启动程序连接
Private Const WM_CAP_DRIVER_GET_NAME = (WM_CAP_START + 12) '获得驱动程序名字
Private Const WM_CAP_DRIVER_GET_VERSION = (WM_CAP_START + 13) '获得驱动程序版本
Private Const WM_CAP_DRIVER_GET_CAPS = (WM_CAP_START + 14) '获得驱动程序性能
Private Const WM_CAP_FILE_SET_CAPTURE_FILEA = (WM_CAP_START + 20) '设置捕获文件的文件名
Private Const WM_CAP_FILE_GET_CAPTURE_FILEA = (WM_CAP_START + 21) '获得捕获文件的文件名
Private Const WM_CAP_FILE_ALLOCATE = (WM_CAP_START + 22) '分派文件,为捕获文件建一个指定大小的文件
Private Const WM_CAP_FILE_SAVEAS = (WM_CAP_START + 23) '另存文件为
Private Const WM_CAP_FILE_SET_INFOCHUNK = (WM_CAP_START + 24) '设置开始文件
Private Const WM_CAP_FILE_SAVEDIB = (WM_CAP_START + 25) '保存文件

Private Const WM_CAP_EDIT_COPY = (WM_CAP_START + 30) '编辑复制,把图象考入剪贴板
Private Const WM_CAP_SET_AUDIOFORMAT = (WM_CAP_START + 35) '设置音频格式
Private Const WM_CAP_GET_AUDIOFORMAT = (WM_CAP_START + 36) '捕获音频格式
Private Const WM_CAP_DLG_VIDEOFORMAT = (WM_CAP_START + 41) '1065 打开视频格式设置对话框,选择数字视频的框架大小和视频图像的色深,以及捕获视频图像的压缩格式。
Private Const WM_CAP_DLG_VIDEOSOURCE = (WM_CAP_START + 42) '1066 打开属性设置对话框,设置对比度、亮度等。(视频源对话框) 选择视频输入通道和视频图像的动态参数。
Private Const WM_CAP_DLG_VIDEODISPLAY = (WM_CAP_START + 43) '1067 打开视频显示对话框
Private Const WM_CAP_GET_VIEOFORMAT = (WM_CAP_START + 44) '1068 获得视频格式 WM_CAP_DLG_VIDEOFORMAT
Private Const WM_CAP_SET_VIDEOFORMAT = (WM_CAP_START + 45) '1069 设置视频格式
Private Const WM_CAP_DLG_VIDEOCOMPRESSION = (WM_CAP_START + 46) '1070 打开压缩设置对话框
Private Const WM_CAP_SET_PREVIEW = (WM_CAP_START + 50) '设置预览模式
Private Const WM_CAP_SET_OVERLAY = (WM_CAP_START + 51) '设置覆盖
Private Const WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52) '设置预览模式下图像的帧速度
Private Const WM_CAP_SET_SCALE = (WM_CAP_START + 53) '设置预览视频的缩放比例
Private Const WM_CAP_GET_STATUS = (WM_CAP_START + 54) '获得状态
Private Const WM_CAP_SET_SCROLL = (WM_CAP_START + 55) '设置卷
Private Const WM_CAP_GRAB_FRame = (WM_CAP_START + 60) '逮捕结构
Private Const WM_CAP_GRAB_FRame_NOSTOP = (WM_CAP_START + 61) '停止逮捕结构,截取当前图象
Private Const WM_CAP_SEQUENCE = (WM_CAP_START + 62) '次序,捕捉到文件
Private Const WM_CAP_SEQUENCE_NOFILE = (WM_CAP_START + 63) '没有文件
Private Const WM_CAP_SET_SEQUENCE_SETUP = (WM_CAP_START + 64) '设置当前捕获的帧频率
Private Const WM_CAP_GET_SEQUENCE_SETUP = (WM_CAP_START + 65) '获得当前捕获的帧频率
Private Const WM_CAP_SET_MCI_DEⅥCE = (WM_CAP_START + 66) '设置媒体控制接口
Private Const WM_CAP_GET_MCI_DEⅥCE = (WM_CAP_START + 67) '获得媒体控制接口
Private Const WM_CAP_STOP = (WM_CAP_START + 68) '停止捕捉
Private Const WM_CAP_ABORT = (WM_CAP_START + 69) '异常中断
Private Const WM_CAP_SINGLE_FRame_OPEN = (WM_CAP_START + 70) '打开单一的结构
Private Const WM_CAP_SINGLE_FRame_CLOSE = (WM_CAP_START + 71) '关闭单一的结构
Private Const WM_CAP_SINGLE_FRame = (WM_CAP_START + 72) '单一的结构
Private Const WM_CAP_PAL_OPEN = (WM_CAP_START + 80) '打开视频
Private Const WM_CAP_PAL_SAVE = (WM_CAP_START + 81) '保存视频
Private Const WM_CAP_PAL_PASTE = (WM_CAP_START + 82) '粘贴视频
Private Const WM_CAP_PAL_AUTOCREATE = (WM_CAP_START + 83) '自动创造
Private Const WM_CAP_PAL_MANUALCREATE = (WM_CAP_START + 84) '手动创造
Private Const WM_CAP_SET_CALLBACK_CAPCONTROL = (WM_CAP_START + 85) '设置收回的错误
Private Const WM_CAP_END = WM_CAP_SET_CALLBACK_CAPCONTROL '
Private hWndC As IntPtr
Private bStat As Boolean = False
Private mControlPtr As IntPtr
Private mWidth As Integer
Private mHeight As Integer
Private mLeft As Integer
Private mTop As Integer

'lpszWindowName 视频窗口的窗口标题
'dwStyle 窗口模式,设置值可用下面数值,也可组合使用:
'WS_Child:视频窗口是子窗口,位于应用程序主窗口内。否则是独立的窗口。
'WS_Visible:视频窗口可见
' WS_Caption:视频窗口有标题栏
' WS_ThickFrame:视频窗口有边框
' X 视频窗口位置x坐标
' Y 视频窗口位置y坐标
'nWidth 视频窗口宽度
'nHeight 视频窗口高度
'hwndParent 创建视频窗口的主窗口,设置为:Me.hWnd
'nID 视频ID
<DllImport("avicap32.dll")> _
Private Shared Function capCreateCaptureWindowA(lpszWindowName As Byte(), dwStyle As Integer, x As Integer, y As Integer, nWidth As Integer, nHeight As Integer, hWndParent As IntPtr, nID As Integer) As IntPtr
End Function

<DllImport("avicap32.dll")> _
Private Shared Function capGetVideoFormat(hWnd As IntPtr, psVideoFormat As IntPtr, wSize As Integer) As Integer
End Function
<DllImport("User32.dll")> _
Private Shared Function SendMessage(hWnd As IntPtr, wMsg As Integer, wParam As Integer, lParam As Long) As Boolean
End Function
''' <summary>
''' 初始化摄像头
''' </summary>
''' <param name="pic">控件的句柄</param>
Public Sub New(pic As PictureBox)
mControlPtr = pic.Handle
mWidth = pic.Width
mHeight = pic.Height
mLeft = 0
mTop = 0

End Sub
Public Sub 连接摄像头(pic As PictureBox)

mControlPtr = pic.Handle
mWidth = pic.Width
mHeight = pic.Height
mLeft = 0
mTop = 0
连接摄像头()
End Sub
''' <summary>
''' 开始显示图像
''' </summary>
Public Sub 连接摄像头()
If bStat Then
Return
End If
bStat = True
Dim lpszName As Byte() = New Byte(99) {}
hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD Or WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0)
If hWndC.ToInt32() <> 0 Then
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, 30, 0) '设置预览速度
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0) '设置叠加
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0) '设置预览
End If
Return
End Sub

''' <summary>
''' 停止显示
''' </summary>
Public Sub 断开摄像头()
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0)
bStat = False
End Sub

''' <summary>
''' 抓图
''' </summary>
''' <param name="path">要保存bmp文件的路径</param>
Public Sub 抓取图像(path As String)
Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
SendMessage(hWndC, WM_CAP_FILE_SAVEDIB, 0, hBmp)
End Sub
''' <summary>
''' 录像
''' </summary>
''' <param name="path">要保存avi文件的路径</param>
Public Sub 开始录像(path As String)
'AVICap默认,把音视频数据从捕获窗口保存到当前驱动得根目录下,文件名称为CAPTURE.AVI
Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp)
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0)
End Sub

''' <summary>
''' 停止录像
''' </summary>
Public Sub 停止录像()
SendMessage(hWndC, WM_CAP_STOP, 0, 0)
End Sub
Public Sub 更换显示控件(pic As PictureBox) 'As PictureBox
断开摄像头()
连接摄像头(pic)
'SendMessage(hWndC, 1111, 0, 0)
'Return pic
End Sub
End Class
...全文
504 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
yishumei 2018-09-13
  • 打赏
  • 举报
回复
没有操作摄像头的经验,只能给楼主提供一个思路:打开任务管理器,录像时观察物理内存,看看可用数是不是越来越少直到蓝屏。

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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