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
. 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
) y que probando con mi webcam un vídeo de 40 segundos me ocupó 350mb de disco
. É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! Os dejo el source:
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\ 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 ¬¬'
:
Saludos