Página 1 de 1

[SRC] [FASM] Controlar WebCam

Publicado: 03 May 2009, 20:05
por Hacker_Zero
Bueno, pues hice esto para explorar lo que ofrece la AVICAP32.DLL y me sorprendió mucho, igual me animo a hacer un reproductor de música y/o vídeo ;D. Bueno el programa tiene algunos fallos como que aveces se freezea al empezar a grabar (igual creando un nuevo hilo se soluciona o igual estoy haciendo algo mal :P) y que probando con mi webcam un vídeo de 40 segundos me ocupó 350mb de disco :o. Ésto creo que es porque no tiene soporte para compresión, igual con otras webcams no pasa, no sé.

EDITO: Pulsar ESC para detener la grabación! ;D

Os dejo el source:

Código: Seleccionar todo

;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\ Ejemplo Controlador de WebCam //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\          By Hacker_Zero       //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\      http://www.eduhack.es    //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\

Format PE GUI 4.0
entry start
include 'C:\fasm\include\win32ax.inc'
include 'C:\fasm\include\api\comdlg32.inc'
include 'C:\fasm\include\api\kernel32.inc'
include 'C:\fasm\include\api\user32.inc'

;Constantes para los botones
ID_COMENZAR                  = 101
ID_PARAR                     = 102
ID_FOTO                      = 103
ID_GUARDAR                   = 104
ID_GRABAR                    = 105
ID_COMPRESION                = 107
ID_VIDEO                     = 108

;Constantes para controlar el driver
WM_CAP_DRIVER_CONNECT        = 1034
WM_CAP_DRIVER_DISCONNECT     = 1035
WM_CAP_FILE_SAVEAS           = 1047
WM_CAP_FILE_SAVEDIB          = 1049
WM_CAP_DLG_VIDEOCOMPRESSION  = 1070
WM_CAP_SET_PREVIEW           = 1074
WM_CAP_SET_PREVIEWRATE       = 1076
WM_CAP_SET_SCALE             = 1077
WM_CAP_GRAB_FRAME            = 1084
WM_CAP_SEQUENCE              = 1086
WM_CAP_DLG_VIDEOFORMAT       = 1065

section '.data' data readable writeable

        nArchivo         rb 256
        hWebcam          dd ?
        Filtro           db 'Bitmap (*.bmp)',0,'*.bmp',0
        Filtro2          db 'AVI (*.avi)',0,'*.avi',0
        CD               OPENFILENAME ?

section '.code' code readable executable
start:

        xor ebx,ebx       ;ebx=0
        invoke GetModuleHandle,ebx
        invoke  DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,ebx
        invoke  ExitProcess,ebx

;Ciclo de eventos de la ventana
proc DialogProc hwnddlg,msg,wparam,lparam
        push    ebx esi edi
        cmp     [msg],WM_CLOSE
        je      wmclose
        cmp     [msg],WM_COMMAND
        je      wmcommand
        cmp     [msg],WM_INITDIALOG
        je      wminitdialog
        xor     eax,eax
        jmp     finish

  wminitdialog:
        invoke capCreateCaptureWindowA,ebx,WS_VISIBLE or WS_CHILD,10,10,350,270,[hwnddlg],ebx
        mov [hWebcam],eax
        jmp processed
  wmcommand:
        cmp [wparam],BN_CLICKED shl 16 + ID_COMENZAR
        je Comenzar_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_PARAR
        je Parar_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_FOTO
        je Foto_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_GUARDAR
        je Guardar_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_GRABAR
        je Grabar_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_COMPRESION
        je Compresion_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_VIDEO
        je Video_Click
        jmp finish

  wmclose:
        invoke  SendMessage,[hWebcam],WM_CAP_DRIVER_DISCONNECT,ebx,ebx
        invoke  DestroyWindow,[hWebcam]
        invoke  EndDialog,[hwnddlg],ebx
  processed:
        mov     eax,1
  finish:
        pop     edi esi ebx
        ret
endp

;Empezamos a capturar
proc Comenzar_Click
     invoke  SendMessage,[hWebcam],WM_CAP_DRIVER_CONNECT,ebx,ebx        ;Conectamos el driver
     invoke  SendMessage,[hWebcam],WM_CAP_SET_SCALE,TRUE,ebx            ;Escalamos la imagen al tamaño de la ventana
     invoke  SendMessage, [hWebcam], WM_CAP_SET_PREVIEWRATE,100,ebx     ;Fotos por segundo que se muestran
     invoke  SendMessage,[hWebcam],WM_CAP_SET_PREVIEW,TRUE,ebx          ;Habilitamos el preview en la ventana
                                                                        ;(que se vea video en la ventana)
     jmp finish
endp

;Paramos de capturar
proc Parar_Click
     invoke SendMessage,[hWebcam],WM_CAP_DRIVER_DISCONNECT,ebx,ebx      ;Desconectamos el driver
     jmp finish
endp

;Guardar imagen en archivo
proc Guardar_Click
     mov [CD.lStructSize],76
     mov [CD.lpstrFilter],Filtro
     mov [CD.lpstrFile],nArchivo
     mov [CD.nMaxFile],256
     invoke GetSaveFileName,CD                                          ;Mostramos el Common Dialog
     invoke lstrcat,nArchivo,'.bmp'                                     ;Añadimos la extensión al archivo
     invoke SendMessage,[hWebcam],WM_CAP_FILE_SAVEDIB,ebx,nArchivo      ;Guardamos la imagen en el archivo.bmp
     jmp finish
endp

;Hacemos una foto
proc Foto_Click
     invoke SendMessage,[hWebcam],WM_CAP_GRAB_FRAME,ebx,ebx             ;Hacemos la foto
     jmp finish
endp

;Empezamos a grabar (pulsar ESC para detener)
proc Grabar_Click
     mov [CD.lStructSize],76
     mov [CD.lpstrFilter],Filtro2
     mov [CD.lpstrFile],nArchivo
     mov [CD.nMaxFile],256
     invoke GetSaveFileName,CD                                         ;Mostramos el Common Dialog
     invoke lstrcat,nArchivo,'.avi'                                    ;Añadimos la extensión al archivo
     invoke SendMessage,[hWebcam],WM_CAP_SEQUENCE,ebx,ebx              ;Empezamos a grabar la secuencia
     invoke SendMessage,[hWebcam],WM_CAP_FILE_SAVEAS,ebx,nArchivo      ;Guardamos la secuencia en el archivo al terminar
     jmp finish
endp

proc Video_Click
     invoke SendMessage,[hWebcam],WM_CAP_DLG_VIDEOFORMAT,ebx,ebx       ;Mostramos la ventana de configuración de
                                                                       ;vídeo (varía según el dispositivo)
     jmp finish
endp

proc Compresion_Click
     invoke SendMessage,[hWebcam],WM_CAP_DLG_VIDEOCOMPRESSION,ebx,ebx  ;Mostramos la ventana de configuración de
                                                                       ;compresión (varía según el dispositivo)
     jmp finish
endp

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL',\
          comdlg32,'COMDLG32.DLL',\
          avicap32,'AVICAP32.DLL'

  import  avicap32,capCreateCaptureWindowA,'capCreateCaptureWindowA'

section '.rsrc' resource data readable

  directory RT_DIALOG,dialogs

  resource dialogs,37,LANG_ENGLISH+SUBLANG_DEFAULT,Principal

  dialog Principal,'WebCam Capturer',330,100,250,220,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
    dialogitem 'BUTTON','Comenzar',ID_COMENZAR,20,180,45,14,WS_VISIBLE
    dialogitem 'BUTTON','Parar',ID_PARAR,70,180,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Foto',ID_FOTO,120,180,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Guardar',ID_GUARDAR,170,180,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Grabar',ID_GRABAR,20,200,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Compresión',ID_COMPRESION,120,200,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Video',ID_VIDEO,170,200,45,15,WS_VISIBLE
  enddialog
Os dejo una captura para los que no quieren compilar ¬¬' ;D:

Imagen


Saludos