2013-10-10 4 views
1

Я пытаюсь создать приложение, которое записывает видео с помощью avicap32.dll, но без использования пользовательского интерфейса. Пример кода, который я нашел (единственный код, который показывает, как записывать видео, а не только изображение) использует hWnd, для которого требуется идентификатор дескриптора изображения. Есть ли способ, которым я могу обойти это, и просто подключиться к драйверу, записать и сохранить видео?VB.Net Capture Video Использование avicap32.dll без UI

Мой код ниже:

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 

ответ

1

Я нашел ответ. Я обычно привык к веб-разработке, и не столько разработке форм Windows, и я понял, что могу создать переменную типа picture-box, и voila, у меня была ручка для ссылки.

Для получения информации у меня есть код ниже, после того, как я немного изменил его.

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 

Нет, что у меня есть код работает, я вижу, что видео не может быть сжат с использованием avicap32.dll и экономит 200 MB видео на 10 секунды захватов. Похоже, мне нужно будет понять DirectShow.net.

2

То, что вы хотите, вероятно, не может быть сделано. VFW и даже некоторые фильтры/игроки DS требуют hWnd для вывода видео. Без него видео выход отсутствует и, следовательно, ничего не делать. Вы можете попытаться обмануть его, обратившись к скрытому или выключенному экрану, но затем Windows просто пропускает живопись, потому что она вне экрана. VFW просто не очень гибкий.