Programación General > Visual Basic 6.0 e inferiores
Procesar frames con AVICap
(1/1)
Geo:
Qué tal amigos, estoy realizando una aplicación de procesamiento de video, para ello estoy utilizando AVICap. De hecho, ya he realizado lo que intento hacer, con C (sin AVICap) y con VB.NET, sin embargo, por motivos didáctivos me han pedido lo implemente también en VB 6 :p.
El problema es que de VB no conozco demasiado, y tengo problemas para poder configurar la función "callback" que se ejecutará al momento de que la cámara se actualiza con el siguiente frame. En VB.NET lo estoy haciendo así (lo tomé de otro código que encontré):
Módulo:
--- Código: Visual Basic --- Delegate Function CallBackDelegate(ByVal hwnd As IntPtr, ByRef lpVhdr As VIDEOHDR) As IntPtr Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As CallBackDelegate) As IntPtr Public Structure VIDEOHDR Dim lpData As Integer '// address of video buffer Dim dwBufferLength As Integer '// size, in bytes, of the Data buffer Dim dwBytesUsed As Integer '// see below Dim dwTimeCaptured As Integer '// see below Dim dwUser As Integer '// user-specific data Dim dwFlags As Integer '// see below <VBFixedArray(3)> Dim dwReserved() As Integer '// reserved; do notuse} End Structure
Clase del form principal:
--- Código: Visual Basic ---Public Class frmCaptura Dim hwdc As Integer Dim conectado As Boolean Dim g As Graphics Private delCallBack As CallBackDelegate = New CallBackDelegate(AddressOf procesaFrame) Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIniciar.Click Dim res As Integer hwdc = capCreateCaptureWindow("Captura Cámara", WS_CHILD Or WS_VISIBLE, 0, 0, 320, 240, picCaptura.Handle.ToInt32, 0) If (hwdc <> 0) Then res = SendMessage(hwdc, WM_CAP_DRIVER_CONNECT, 0, 0) res = SendMessage(hwdc, WM_CAP_SET_PREVIEW, 1, 0) res = SendMessage(hwdc, WM_CAP_SET_PREVIEWRATE, 60, 0) conectado = True ' Configura callback res = SendMessage(hwdc, WM_CAP_SET_CALLBACK_FRAME, New IntPtr(0), delCallBack) Else MsgBox("No se encontró dispositivo de captura") End If End Sub... Private Function procesaFrame(ByVal hwnd As IntPtr, ByRef lpVHdr As VIDEOHDR) As IntPtr ... End Function
¿Alguien sabría cómo hacerlo en VB 6? De hecho, ya tengo un avance, pero me gustaría saber si alguien ya lo ha hecho y que pudiera echarme una mano :). Por el momento ya los estoy convenciendo de trabajar con .NET (con VB o C#, que lo manejo mejor), ya que con C/C++ por el momento nop (este si lo domino :p).
Gracias.
Geo:
Ya lo conseguí, aunque ahora tengo problemas con el manejo de memoria dentro de la función callback, a ver si puedo con esto :).
Navegación
Ir a la versión completa