Programación de cámara sin controlador vb6, código fuente
El siguiente es un código de controlador de cámara VB que escribí hace unos años (referencia). No sé si todavía se puede usar ahora, porque el archivo generalmente es muy largo. Una pequeña parte espero que pueda serle útil (o contácteme y le daré el código fuente)
Private Sub Form_Load()
En caso de error, reanudar a continuación.
Dim retVal As Boolean
Dim numDevs As Long
bCaramaPlaying = True
'cargar configuraciones triviales primero
Me.BackColor = Val(GetSetting(App .Title, "preferences", "backcolor", "amp; H404040")) 'predeterminado en gris oscuro
numDevs = VBEnumCapDrivers(Me)
Si 0 = numDevs Entonces p>
MsgBox "¡Dispositivo de captura de vídeo no encontrado!", vbCritical, App.Title
' frmPlayer.Visible = True
' Si bIsVisible = True And vbPlayFormIsVisible = True And vbFrmPlayFrameHided = False Then
' frmPlayFrame.Visible = True
' Finaliza si
Descargarme
Salir de Sub
Fin si
nDriverIndex = Val(GetSetting(App.Title, "driver", "index", "0"))
'si hay una entrada no válida en el registro, utilice el valor predeterminado (0)
If mnuDriver.UBound lt nDriverIndex Then
nDriverIndex = 0
End If
mnuDriver(nDriverIndex).Checked = True
'//Crear ventana de captura
'Llamar a capGetDriverDescription( nDriverIndex, lpszName, 100, lpszVer, 100 '// Recupera el controlador info
hCapWnd = capCreateCaptureWindow("VB CAP WINDOW", WS_CHILD Or WS_VISIBLE, 0, 0, 160, 120, Me.hWnd, 0)
Si 0 = hCapWnd Entonces p>
MsgBox "¡No se puede crear la ventana de captura!", vbCritical, App.Title
Salir de Sub
End If
retVal = ConnectCapDriver(hCapWnd, nDriverIndex)
Si False = retVal Entonces
MsgBox "¡No se puede conectar al dispositivo de video!", vbInformation, App.Title
Else
#If USECALLBACKS = 1 Luego
' si tenemos un capwnd válido podemos habilitar nuestra función de devolución de llamada de estado
Llamar a capSetCallbackOnStatus(hCapWnd, AddressOf StatusProc)
Debug.Print "- --Devolución de llamada configurada en el estado de captura---"
#End If
End If
'// Establece la función de devolución de llamada de transmisión de video
' capSetCallbackOnVideoStream lwndC, AddressOf MyVideoStreamCallback
' capSetCallbackOnFrame lwndC, AddressOf MyFrameCallback
Dim bPlayFrameTop como booleano
bPlayFrameTop = GetSetting(MyName, "configuración" amp ; "-" amplificador; Trim(Str(App.Major)) amp; "-" amplificador(Str(App.Minor)), "bPlayFrameTop", "False")
Si bPlayFrameTop = True Then
Me.mnuOptionTop.Checked = True
'Poner delante
SetWindowPos Me.hWnd, HWND_TOPMOST, Me.Left / Screen.TwipsPerPixelX, Me .Top / Screen.TwipsPerPixelY, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY, & H20
Else
Me.mnuOptionTop.Checked = False p >
'No en la parte superior
SetWindowPos Me.hWnd, HWND_NOTOPMOST, Me.Left / Screen.T
wipsPerPixelX, Me.Top / Screen.TwipsPerPixelY, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY, & H20
End If
Me.Left = ( Pantalla .Width - Me.Width) / 2
Me.Top = (Screen.Height - Me.Height) / 2
Me.picShowMenu.ZOrder 0
End Sub
'El siguiente es un archivo de módulo
Option Explicit
'Las rutinas específicas de la aplicación están aquí
Public Const ONE_MEGABYTE As Largo = 1048576
'Const pública MMSYSERR_NOERROR Mientras largo = 0
Const pública INDEX_15_MINUTES Mientras largo = 27000 '(30fps * 60seg * 15min)
Const pública INDEX_3_HOURS As Long = 324000 ' (30fps * 60seg * 60min * 3hr)
Función pública GetFreeSpace() As Long
'esta función obtiene la cantidad de espacio libre en disco y agrega el tamaño
'del archivo de captura actual
Dim freedisk As Long
Atenuar ruta como cadena
'obtener longitud del archivo Cap
ruta = capFileGetCaptureFile(frmCaramaMain.capwnd)
Si ruta lt;gt "" Entonces
En caso de error, reanudar siguiente
freedisk = FileLen(ruta )
freedisk = freedisk / ONE_MEGABYTE
End If
'ahora obtiene espacio libre en disco de esa unidad
path = Left$( ruta, 3)
GetFreeSpace = freedisk vbGetAvailableMBytes(ruta)
Función final
Sub ResizeCaptureWindow(ByVal hCapWnd As Long)
Dim retVal As Boolean
Dim capStat As CAPSTATUS
'Obtener los atributos de la ventana de captura
retVal = capGetStatus(hCapWnd, capStat)
Si retVal Entonces
'Cambiar el tamaño del formulario principal para que quepa
Llamar a SetWindowPos(frmCaramaMain.hWnd, _
0amp;, _
0amp;, _
0amp;, _
capStat.uiImageWidth (frmCaramaMain.XBorder * 2), _
capStat.uiImageHeight (frmCaramaMain.YBorder * 4) _
frmCaramaMain.CaptionHeight frmCaramaMain.MenuHeight, _
Swp_nomove o SWP_NOZORDER o SWP_NOSENDCHANGING)
'Cambiar el tamaño de la ventana de captura para formatear el tamaño
Llamar a SetWindowPos(hCapWnd, _
0amp;, _
0amp;, _
0amp;, _
capStat.uiImageWidth, _
capStat.uiImageHeight, _
Swp_nomove o SWP_NOZORDER o SWP_NOSENDCHANGING)
Finalizar si
Llamada a frmCaramaMain.Form_Resize
End Sub
Función pública VBEnumCapDrivers(ByRef frm As frmCaramaMain) Siempre
'/*
' * Enumere los posibles controladores de captura y agregue la lista al menú Opciones
' * Esta función solo se llama una vez al inicio.
' *. Devuelve 0 si no hay controladores disponibles.
' */
Const MAXVIDDRIVERS As Long = 9
Const CAP_STRING_MAX
Mientras = 128
Atenuar numDrivers mientras
Atenuar cadenas de controladores (0 a MAXVIDDRIVERS - 1) como cadena
Atenuar índice mientras
Atenuar dispositivo como cadena
Atenuar versión como cadena
Atenuar menú como VB.menu
Dispositivo = Cadena$(CAP_STRING_MAX, 0)
Versión = String$(CAP_STRING_MAX, 0)
numDrivers = 0
Para Índice = 0 A (MAXVIDDRIVERS - 1) Paso 1
Si 0 lt ;gt; capGetDriverDescription(Índice, _
Dispositivo, _
CAP_STRING_MAX, _
Versión, _
CAP_STRING_MAX) _ p> p>
Luego
'extiende el menú
Si Index gt 0 Entonces
Cargar frm.mnuDriver(Index)
End If
Set menu = frm.mnuDriver(Index) 'obtiene un puntero de objeto al nuevo menú
'Concatena el nombre del dispositivo y las cadenas de versión al nuevo elemento del menú
p>menu.Caption = Left$(Dispositivo, InStr(Dispositivo, vbNullChar) - 1)
menu.Caption = menu.Caption amp; p> menú. Caption = menu.Caption & Left$(Version, InStr(Version, vbNullChar) - 1)
menu.Enabled = True
numDrivers = numDrivers 1
Finalizar si
Siguiente
VBEnumCapDrivers = numDrivers
Finalizar función
Pub
Función lic ConnectCapDriver(ByVal hCapWnd As Long, ByVal nDriverIndex As Long) Como booleano
Dim retVal Como booleano
Atenuar mayúsculas como CAPDRIVERCAPS
Dim i As Long
Debug.Assert (nDriverIndex lt; 10) And (nDriverIndex gt; = 0)
'// Conecta la ventana de captura al controlador
retVal = capDriverConnect (hCapWnd, nDriverIndex)
Si False = retVal Entonces
'return False
Salir de la función
Finalizar si
'// Obtener las capacidades del controlador de captura
retVal = capDriverGetCaps(hCapWnd, Caps)
If False lt;gt; retVal Then
' restablecer menús (muy específicos de la aplicación)
Con frmCaramaMain
For i = 0 To .mnuDriver.UBound
.mnuDriver(i).Checked = False ' asegúrese de que todos los controladores estén desmarcados
Siguiente
.mnuDriver(nDriverIndex).Checked = True 'luego verifique el nuevo controlador
'deshabilite todos los elementos del menú de funciones de hardware
.mnuSource.Enabled = False
.mnuFormat.Enabled = False
.mnuDisplay.Enabled = False
.mnuOverlay.Enabled = False
'Luego habilite los que son compatibles con el nuevo controlador
If Caps.fHasDlgVideoSource lt;gt 0 Then .mnuSource.Enabled = True
Si Caps.fHasDlgVideoFormat lt;gt;
es .mnuFormat.Enabled = True
Si Caps.fHasDlgVideoDisplay lt;gt; 0 Entonces .mnuDisplay.Enabled = True
Si Caps.fHasOverlay lt;gt; Habilitado = Verdadero
Finalizar con
Finalizar si
'// Establecer la velocidad de vista previa en milisegundos
Llamar a capPreviewRate(hCapWnd, 66 ) '15 FPS
'// Comience a obtener una vista previa de la imagen desde la cámara
Llame a capPreview(hCapWnd, True)
'de forma predeterminada, muestra una vista previa cada vez
frmCaramaMain.mnuPreview.Checked = True
'// Cambia el tamaño de la ventana de captura para mostrar la imagen completa
Llama a ResizeCaptureWindow(hCapWnd)
ConnectCapDriver = True
Función final
Función pública StatusProc(ByVal hCapWnd As Long, ByVal StatusCode As Long, ByVal lpStatusString As Long) As Long
Seleccionar Código de estado del caso
Caso 0 'esto se recomienda en los documentos
'cuando se envía cero, borre los mensajes de estado antiguos
'frmCaramaMain.Caption = App.Title
Caso IDS_CAP_END ' La captura de video ha finalizado
frmCaramaMain.Caption = App.Title
Caso IDS_CAP_STAT_VIDEOAUDIO, IDS_CAP_STAT_VIDEOONLY
MsgBox LPSTRtoVBString(lpStatusString) , vbInformation, App.Title
Case Else
'usa esta función si necesitas un VB real
string
'frmCaramaMain.Caption = LPSTRtoVBString(lpStatusString)
'o simplemente pase el LPCSTR a una función WINAPI
Llame a SetWindowTextAsLong(frmCaramaMain.hWnd, lpStatusString )
Finalizar selección
Debug.Print "Código devuelto por el controlador " & StatusCode & " a StatusProc"
StatusProc = -(True) '- convierte booleano a C BOOL
Función final