change source video for capture webcam

2k views Asked by At

I have a program that uses a webcam that can take pictures. The source of this program is as follows:

Imports System
Imports System.Runtime
Imports System.Runtime.InteropServices

Module modWebcam
    Public Const WM_CAP As Short = &H400S
Public Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
Public Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
Public Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
Public Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
Public Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
Public Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53
Public Const WS_CHILD As Integer = &H40000000
Public Const WS_VISIBLE As Integer = &H10000000
Public Const SWP_NOMOVE As Short = &H2S
Public Const SWP_NOSIZE As Short = 1
Public Const SWP_NOZORDER As Short = &H4S
Public Const HWND_BOTTOM As Short = 1

Public iDevice As Integer = 0 ' Current device ID
Public hHwnd As Integer ' Handle to preview window

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
    <MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) As Integer

Public 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

Public Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean

Public 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

Public 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
End Module





Private Sub OpenPreviewWindow()
    On Error Resume Next
    ClearAllObject()

    Dim iHeight As Integer = Panel2.Height
    Dim iWidth As Integer = Panel2.Width

    '
    ' Open Preview window in picturebox
    '
    hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, _
        480, picEye.Handle.ToInt32, 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, 66, 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, picEye.Width, picEye.Height, _
                SWP_NOMOVE Or SWP_NOZORDER)


    End If
End Sub







  Private Sub bntVideoFormat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bntVideoFormat.Click
        On Error Resume Next
        Main_Frm.webcam.ResolutionSetting()
    End Sub

   Private Sub Btn_AdvanceSetting(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AdvanceSetting.Click
        On Error Resume Next
        Main_Frm.webcam.AdvanceSetting()
    End Sub


         Private Sub Btn_showWebcam(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_showWebcam.Click
       picEye.SizeMode = PictureBoxSizeMode.StretchImage
            webcam = New WebCam()
            webcam.InitializeWebCam(picEye)
            webcam.Start()
End Sub

I want the source code from the S-video video video composet change that. But I can not.

1

There are 1 answers

4
Roman Ryltsov On

To change source, if at all possible, you need to pop up one of the configuration dialogs using WM_CAP_DLG_* messages. Most likely you need WM_CAP_DLG_VIDEOSOURCE. Note that:

The Video Source dialog box is unique for each capture driver. Some capture drivers might not support a Video Source dialog box.

You will need additional API constants, you can get those values from:

  #region API Constants
  public const int WM_USER = 1024;
  public const int WM_CAP_CONNECT = 1034;
  public const int WM_CAP_DISCONNECT = 1035;
  public const int WM_CAP_GET_FRAME = 1084;
  public const int WM_CAP_COPY = 1054;
  public const int WM_CAP_START = WM_USER;
  public const int WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41;
  public const int WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42;
  public const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43;
  public const int WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44;
  public const int WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45;
  public const int WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46;
  public const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
  #endregion

Also note that you chose the oldest Windows API for video, and it's pretty limited, so you might want to consider switching to something newer.