Results 1 to 2 of 2

Thread: Capturing screen and webcam video simultaneously?

  1. #1
    sspears2020 is offline VB.NET Forum Newbie
    .NET Framework
    .NET 3.5
    Join Date
    Nov 2010
    Posts
    3
    Reputation
    0

    Question Capturing screen and webcam video simultaneously?

    Hey guys,

    I'm working on a screen capture and webcam capture program that will record both at the same time. I currently have a button that starts the screen cap (while opening a ppt) and a keyboard hook that stops it when I hit F12. I also have a button that starts webcam recording, and a button that stops the recording.

    So they are both working individually, but when I try to do both at the same time (calling both actions when I hit the start capture button) it sort of freezes up both processes. I'm thinking maybe they need to be run on different threads but I've tried doing so and I think I'm either doing it wrong or its just not making any difference?

    Also on a side note - when I am capturing video from the webcam the keyboard hook no longer works :/

    Here is the code for my form, if you want the keyboard hook let me know:

    Code:
    Imports Microsoft.Expression.Encoder.ScreenCapture
    Imports Microsoft.Office.Interop
    Imports Microsoft.Office.Interop.PowerPoint
    Imports Microsoft.Expression.Encoder.Devices
    Imports System.Runtime.InteropServices
    Imports System.Windows.Forms
    Imports System.Threading
    
    Public Class VideoRecorder
        Inherits System.Windows.Forms.Form
    
        Dim ScreenCap As New ScreenCaptureJob
        Dim appPowerpoint As PowerPoint.Application = New PowerPoint.Application
        Dim ShutDownAll As Boolean = False
        Dim shortName As String
    
        ' Create constant using attend in function of DLL file.
    
        Const WM_CAP As Short = &H400S
        Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
        Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
        Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
        Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
        Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
        Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53
        Const WS_CHILD As Integer = &H40000000
        Const WS_VISIBLE As Integer = &H10000000
        Const SWP_NOMOVE As Short = &H2S
        Const SWP_NOSIZE As Short = 1
        Const SWP_NOZORDER As Short = &H4S
        Const HWND_BOTTOM As Short = 1
        Const WM_CAP_FILE_SAVEAS As Integer = WM_CAP + 23
        Const WM_CAP_SEQUENCE As Integer = WM_CAP + 62
    
        Dim iDevice As Integer = 0  ' Normal device ID 
        Dim hHwnd As Integer  ' Handle value to preview window
    
        ' Declare function from AVI capture DLL.
    
        Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
            (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, _
             ByVal lParam As String) 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
    
        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 hWndParent As Integer, _
            ByVal nID As Integer) As Integer
    
        Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, _
            ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, _
            ByVal cbVer As Integer) As Boolean
    
        Dim WithEvents K As New Keyboard
    
        Private Sub VideoRecorder_Load1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            K.CreateHook()
            OpenPreviewWindow()
    
        End Sub
    
        Private Sub VideoRecorder_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            K.DiposeHook()
            ClosePreviewWindow()
        End Sub
    
        Private Sub K_Down(ByVal Key As String) Handles K.Down
            If Key.ToString = "<F12>" Then
                Label1.Text = Key.ToString
                ShutDownAll = True
                Timer2.Enabled = True
            End If
        End Sub
    
        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            If ShutDownAll = True Then
                'StopVideoCap()
                ScreenCap.Stop()
                ScreenCap.Dispose()
                appPowerpoint.ActivePresentation.Close()
                appPowerpoint.Quit()
                Me.Close()
            End If
        End Sub
    
        Private Sub btnChooseFile_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChooseFile.Click
            ChooseFileDialog.ShowDialog()
            txtChooseFile.Text = ChooseFileDialog.FileName
            Dim less As Integer
            If txtChooseFile.Text.Contains(".ppt") Then
                less = 4
                If txtChooseFile.Text.Contains(".pptx") Then
                    less = 5
                End If
            End If
            shortName = txtChooseFile.Text.Substring(0, txtChooseFile.Text.Length - less)
        End Sub
    
        Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
            If txtChooseFile.Text = "" Then
                MsgBox("Please choose a PowerPoint file.")
                Exit Sub
            End If
    
            'open powerpoint slideshow
            Try
                Process.Start(txtChooseFile.Text)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    
            appPowerpoint.Activate()
    
            'capture settings
            ScreenCap.CaptureMouseCursor = False
            ScreenCap.CaptureRectangle = Screen.PrimaryScreen.Bounds
            ScreenCap.ShowCountdown = True
            ScreenCap.OutputScreenCaptureFileName = shortName + "_scr" + ".wmv"
            ScreenCap.ScreenCaptureVideoProfile.FrameRate = 60
            ScreenCap.Start()
    
            Timer1.Start()
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If appPowerpoint.Presentations.Count = 1 Then
                StartShow()
                Timer1.Enabled = False
            End If
        End Sub
    
        Private Sub StartShow()
            appPowerpoint.ActivePresentation.SlideShowSettings.Run()
            'StartVideoCap()
        End Sub
    
    
        '***************** VIDEO CAPTURE ************************
        Private Sub OpenPreviewWindow()
            Dim iHeight As Integer = picCapture.Height
            Dim iWidth As Integer = picCapture.Width
    
            ' Open Preview window in picturebox .
            ' Create a child window with capCreateCaptureWindowA so you can display it in a picturebox.
    
            hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, _
                480, picCapture.Handle.ToInt32, 0)
    
            'Label1.Text = SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0)
            ' Connect to device
            If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
    
                ' Set the preview scale
                SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)
    
                ' Set the preview rate in milliseconds
                SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 15, 0)
    
                ' Start previewing the image from the camera 
                SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)
    
                ' Resize window to fit in picturebox 
                SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picCapture.Width, picCapture.Height, _
                                       SWP_NOMOVE Or SWP_NOZORDER)
                'btnSave.Enabled = True
                btnStop.Enabled = True
            Else
                ' Error connecting to device close window 
                DestroyWindow(hHwnd)
            End If
        End Sub
    
        ' Finally, to close the preview window, disconnect from the device and destroy the preview window. 
    
        Private Sub ClosePreviewWindow()
            ' Disconnect from device
            SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0)
    
            ' close window 
            DestroyWindow(hHwnd)
        End Sub
    
        Private Sub StartVideoCap()
            Try
                SendMessage(hHwnd, WM_CAP_SEQUENCE, 0, 0)
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub
        Private Sub StopVideoCap()
            Dim avi As String = shortName & "_avi" & ".avi"
    
            'SAVE FILE
            Try
                SendMessage(hHwnd, WM_CAP_FILE_SAVEAS, 0, avi)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
    
        Private Sub btnTestStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTestStart.Click
            StartVideoCap()
        End Sub
    
        Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
            StopVideoCap()
        End Sub
    
    End Class

  2. #2
    inilm is offline VB.NET Forum Newbie
    .NET Framework
    .NET 4.0
    Join Date
    May 2011
    Posts
    1
    Reputation
    0
    hi sspears2020
    do u manage to solve your problem?
    I had the same problem too that freeze up my applications. If yes, please update me. TQ

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Harvest time tracking