2015-04-18 5 views
0

У меня есть программа, которая использует веб-камеру, которая может делать снимки. Источник этой программы выглядит следующим образом:изменить исходное видео для захвата веб-камеры

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 

Я хочу, чтобы исходный код из видео видео S-видео composet изменить. Но я не могу.

+0

Вы говорите «* Но я не могу. *», Но вы не даете дополнительной информации. Что делает ваш код? Представьте себе, что у людей нет времени на чтение и полное понимание вашего кода. С какими конкретными проблемами вы сталкиваетесь? Измените свой вопрос, чтобы добавить дополнительную информацию, чтобы мы могли вам помочь. Спасибо –

+0

У меня есть программа для использования веб-камеры для фотосъемки. Но прежде чем я получу свои фотографии в своих настройках (установите источник видео на композитный видеоролик). Эта настройка может быть выполнена пользователем, но я хочу сделать кодировку. См. Следующие источники. http://www.vb-tips.com/Webcam.aspx – Spark

+0

Как я вижу, 'On Error Resume Next' - ваша самая большая проблема. – Eminem

ответ

0

Чтобы изменить источник, если это вообще возможно, вам нужно открыть один из диалоговых окон конфигурации, используя сообщения WM_CAP_DLG_*. Скорее всего, вам нужно WM_CAP_DLG_VIDEOSOURCE. Обратите внимание:

Диалоговое окно Video Source уникально для каждого драйвера захвата. Некоторые драйверы захвата могут не поддерживать диалоговое окно Video Source.

Вам понадобятся дополнительные константы API, вы можете получить эти значения из:

#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 

Также обратите внимание, что вы выбрали самый старый Windows API для видео, и это довольно ограничено, так что вы можете рассмотреть вопрос о переход на что-то более новое.

+0

Я использовал следующий код и окно исходного видео. Я не хочу, чтобы это окно отображалось, я хочу изменить видеовход непосредственно на композицию видео. SendMessage (hHwnd, WM_CAP_DLG_VIDEOSOURCE, True, 1) – Spark

+0

Водитель может помнить настройку, которую вы когда-то устанавливали в интерактивном режиме. Я не думаю, что вы можете изменить его иначе, чем через диалоговое окно пользовательского интерфейса. Этот API был создан 20 лет назад, в то время этого было достаточно. Используйте DirectShow, и вы можете программно изменить ввод программ. –

+0

Большое вам спасибо за вашу поддержку. Новейший метод, который можно использовать? – Spark