Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用avicap32.dll(无用户界面)捕获VB.Net视频_Vb.net_Video_Webcam_Avi - Fatal编程技术网

使用avicap32.dll(无用户界面)捕获VB.Net视频

使用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

我正在尝试创建一个应用程序,该应用程序使用avicap32.dll录制视频,但不使用用户界面。我找到的示例代码(显示如何录制视频而不仅仅是捕获图像的唯一代码)使用了一个需要图片框句柄ID的hWnd。有没有什么方法可以绕过这个问题,只需连接到驱动程序,录制并保存视频

我的代码如下:

导入系统
导入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