使用avicap32.dll(无用户界面)捕获VB.Net视频
我正在尝试创建一个应用程序,该应用程序使用avicap32.dll录制视频,但不使用用户界面。我找到的示例代码(显示如何录制视频而不仅仅是捕获图像的唯一代码)使用了一个需要图片框句柄ID的hWnd。有没有什么方法可以绕过这个问题,只需连接到驱动程序,录制并保存视频 我的代码如下:使用avicap32.dll(无用户界面)捕获VB.Net视频,vb.net,video,webcam,avi,Vb.net,Video,Webcam,Avi,我正在尝试创建一个应用程序,该应用程序使用avicap32.dll录制视频,但不使用用户界面。我找到的示例代码(显示如何录制视频而不仅仅是捕获图像的唯一代码)使用了一个需要图片框句柄ID的hWnd。有没有什么方法可以绕过这个问题,只需连接到驱动程序,录制并保存视频 我的代码如下: 导入系统 导入System.Runtime.InteropServices 公共类记录器 Const WM_CAP_START=&H400S Const WS_CHILD=&H40000000 常量WS_可见=&H1
导入系统
导入System.Runtime.InteropServices
公共类记录器
Const WM_CAP_START=&H400S
Const WS_CHILD=&H40000000
常量WS_可见=&H10000000
常数WM\U CAP\U驱动器连接=WM\U CAP\U启动+10
常数WM\U CAP\U驱动器\U断开=WM\U CAP\U启动+11
常数WM\u CAP\u EDIT\u COPY=WM\u CAP\u START+30
常量WM\U CAP\U序列=WM\U CAP\U START+62
Const WM_CAP_FILE_SAVEAS=WM_CAP_START+23
常数WM\U CAP\U SET\U SCALE=WM\U CAP\U START+53
常数WM\U CAP\U SET\U PREVIEWRATE=WM\U CAP\U START+52
常数WM\U CAP\U SET\U PREVIEW=WM\U CAP\U START+50
常量SWP_NOMOVE=&H2S
常数SWP_NOSIZE=1
常量SWP_NOZORDER=&H4S
常数HWND_底部=1
将函数capGetDriverDescriptionA Lib“avicap32.dll”(ByVal wDriverIndex为短,ByVal lpszName为字符串,ByVal cbName为整数,ByVal lpszVer为字符串,ByVal cbVer为整数)声明为布尔值
将函数capCreateCaptureWindowA Lib“avicap32.dll”(ByVal lpszWindowName为字符串,ByVal dwStyle为整数,ByVal x为整数,ByVal y为整数,ByVal nWidth为整数,ByVal nHeight为短,ByVal hWnd为整数,ByVal nID为整数)声明为整数
将函数SendMessage Lib“user32”别名“SendMessageA”(ByVal hwnd为整数,ByVal Msg为整数,ByVal wParam为整数,ByVal lParam为对象)声明为整数
私有共享函数ReturnDriver()作为整数“作为字符串
Dim DriverName作为字符串=空格(100)
Dim DriverVersion作为字符串=空间(100)
'Dim ReturnDriverName As String=“”
Dim DriverIndex为整数=无
对于i,整数=0到9
如果capGetDriverDescriptionA(i,DriverName,80,DriverVersion,80),则
'lstVideoSources.Items.Add(DriverName.Trim)
'ReturnDriverName=DriverName.Trim
DriverIndex=i
退出
如果结束
下一个
返回驱动器索引
端函数
公共共享子StartRecording()
Dim DriverVersion作为整数=ReturnDriver()
如果发送消息(0,WM\U CAP\U DRIVER\U CONNECT,DriverVersion,0),则
发送消息(0,WM\U CAP\U序列,0,0)
如果结束
端接头
公共共享子停止录制()
SendMessage(0,WM_CAP_FILE_SAVEAS,0,“C:\records\”和Now().ToString()和.avi)
端接头
末级
你想要的很可能无法实现。VFW甚至一些DS过滤器/播放器都需要hWnd来绘制视频输出。没有它,就没有视频输出,因此也就没有可捕获的内容。您可以尝试通过绘制到隐藏或屏幕外控件来欺骗它,但Windows只是跳过绘制,因为它是屏幕外的。VFW不是很灵活。我找到了一个答案。我通常习惯于web开发,而不是windows窗体开发,我意识到我可以创建一个类型为picture box的变量,瞧,我有一个引用句柄
作为参考,在我重新考虑了一下之后,我在下面有了我的代码。
Const WM\u CAP\u START=&H400S
Const WS_CHILD=&H40000000
常量WS_可见=&H10000000
常数WM\U CAP\U驱动器连接=WM\U CAP\U启动+10
常数WM\U CAP\U驱动器\U断开=WM\U CAP\U启动+11
常数WM\u CAP\u EDIT\u COPY=WM\u CAP\u START+30
常量WM\U CAP\U序列=WM\U CAP\U START+62
Const WM_CAP_FILE_SAVEAS=WM_CAP_START+23
常数WM\U CAP\U SET\U SCALE=WM\U CAP\U START+53
常数WM\U CAP\U SET\U PREVIEWRATE=WM\U CAP\U START+52
常数WM\U CAP\U SET\U PREVIEW=WM\U CAP\U START+50
常量SWP_NOMOVE=&H2S
常数SWP_NOSIZE=1
常量SWP_NOZORDER=&H4S
常数HWND_底部=1
将函数capGetDriverDescriptionA Lib“avicap32.dll”(ByVal wDriverIndex为短,ByVal lpszName为字符串,ByVal cbName为整数,ByVal lpszVer为字符串,ByVal cbVer为整数)声明为布尔值
将函数capCreateCaptureWindowA Lib“avicap32.dll”(ByVal lpszWindowName为字符串,ByVal dwStyle为整数,ByVal x为整数,ByVal y为整数,ByVal nWidth为整数,ByVal nHeight为短,ByVal hWnd为整数,ByVal nID为整数)声明为整数
将函数SendMessage Lib“user32”别名“SendMessageA”(ByVal hwnd为整数,ByVal Msg为整数,ByVal wParam为整数,ByVal lParam为对象)声明为整数
将函数SetWindowPos Lib“user32”别名“SetWindowPos”(ByVal hwnd为整数,ByVal hwninsertafter为整数,ByVal x为整数,ByVal y为整数,ByVal cx为整数,ByVal cy为整数,ByVal wFlags为整数)声明为整数
将函数DestroyWindow Lib“user32”(ByVal hndw作为整数)声明为布尔值
作为整数的私有hWnd
作为整数的私有驱动服务器
Private mypicture As PictureBox=新PictureBox()
公共分新()
DriverVersion=ReturnDriver()
hWnd=capCreateCaptureWindowA(DriverVersion,WS_VISIBLE或WS_CHILD,0,0,0,mypicture.Handle.ToInt32,0)
端接头
私有函数ReturnDriver()为整数
Dim DriverName作为字符串=空格(100)
Dim DriverVersion作为字符串=空间(100)
Dim DriverIndex为整数=无
对于i,整数=0到9
如果capGetDriverDescriptionA(i,DriverName,80,DriverVersion,80),则
DriverIndex=i
退出
如果结束
下一个
返回驱动器索引
端函数
公共子StartRecording()
如果发送消息(hWnd、WM\U CAP\U DRIVER\U CONNECT、DriverVersion,0),则
发送消息(hWnd,WM\U CAP\U序列,0,0)
如果结束
端接头
Imports System
Imports System.Runtime.InteropServices
Public Class Recorder
Const WM_CAP_START = &H400S
Const WS_CHILD = &H40000000
Const WS_VISIBLE = &H10000000
Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
Const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
Const WM_CAP_EDIT_COPY = WM_CAP_START + 30
Const WM_CAP_SEQUENCE = WM_CAP_START + 62
Const WM_CAP_FILE_SAVEAS = WM_CAP_START + 23
Const WM_CAP_SET_SCALE = WM_CAP_START + 53
Const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52
Const WM_CAP_SET_PREVIEW = WM_CAP_START + 50
Const SWP_NOMOVE = &H2S
Const SWP_NOSIZE = 1
Const SWP_NOZORDER = &H4S
Const HWND_BOTTOM = 1
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriverIndex As Short, ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer As Integer) As Boolean
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Short, ByVal hWnd As Integer, ByVal nID As Integer) As Integer
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, <MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) As Integer
Private Shared Function ReturnDriver() As Integer 'As String
Dim DriverName As String = Space(100)
Dim DriverVersion As String = Space(100)
'Dim ReturnDriverName As String = ""
Dim DriverIndex As Integer = Nothing
For i As Integer = 0 To 9
If capGetDriverDescriptionA(i, DriverName, 80, DriverVersion, 80) Then
'lstVideoSources.Items.Add(DriverName.Trim)
'ReturnDriverName = DriverName.Trim
DriverIndex = i
Exit For
End If
Next
Return DriverIndex
End Function
Public Shared Sub StartRecording()
Dim DriverVersion As Integer = ReturnDriver()
If SendMessage(0, WM_CAP_DRIVER_CONNECT, DriverVersion, 0) Then
SendMessage(0, WM_CAP_SEQUENCE, 0, 0)
End If
End Sub
Public Shared Sub StopRecording()
SendMessage(0, WM_CAP_FILE_SAVEAS, 0, "C:\records\" & Now().ToString() & ".avi")
End Sub
End Class
Const WM_CAP_START = &H400S
Const WS_CHILD = &H40000000
Const WS_VISIBLE = &H10000000
Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
Const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
Const WM_CAP_EDIT_COPY = WM_CAP_START + 30
Const WM_CAP_SEQUENCE = WM_CAP_START + 62
Const WM_CAP_FILE_SAVEAS = WM_CAP_START + 23
Const WM_CAP_SET_SCALE = WM_CAP_START + 53
Const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52
Const WM_CAP_SET_PREVIEW = WM_CAP_START + 50
Const SWP_NOMOVE = &H2S
Const SWP_NOSIZE = 1
Const SWP_NOZORDER = &H4S
Const HWND_BOTTOM = 1
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriverIndex As Short, ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer As Integer) As Boolean
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Short, ByVal hWnd As Integer, ByVal nID As Integer) As Integer
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, <MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) As Integer
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean
Private hWnd As Integer
Private DriverVersion As Integer
Private mypicture As PictureBox = New PictureBox()
Public Sub New()
DriverVersion = ReturnDriver()
hWnd = capCreateCaptureWindowA(DriverVersion, WS_VISIBLE Or WS_CHILD, 0, 0, 0, 0, mypicture.Handle.ToInt32, 0)
End Sub
Private Function ReturnDriver() As Integer
Dim DriverName As String = Space(100)
Dim DriverVersion As String = Space(100)
Dim DriverIndex As Integer = Nothing
For i As Integer = 0 To 9
If capGetDriverDescriptionA(i, DriverName, 80, DriverVersion, 80) Then
DriverIndex = i
Exit For
End If
Next
Return DriverIndex
End Function
Public Sub StartRecording()
If SendMessage(hWnd, WM_CAP_DRIVER_CONNECT, DriverVersion, 0) Then
SendMessage(hWnd, WM_CAP_SEQUENCE, 0, 0)
End If
End Sub
Public Sub StopRecording(byval FileName As String)
Try
FileName = "C:/records/_" & FileName & ".avi"
SendMessage(hWnd, WM_CAP_FILE_SAVEAS, 0, FileName)
SendMessage(hWnd, WM_CAP_DRIVER_DISCONNECT, DriverVersion, 0)
System.IO.File.Delete("C:/CAPTURE.avi")
Catch ex As Exception
End Try
End Sub