Rabu, 23 Juli 2008

Main-main Sama WebCam Yuk...

Webcam emang bukan barang baru bagi para chatter. Buat yang sering pake Yahoo Messenger, MSN, Skype, dll pasti asyik kalo bisa ngobrol sekaligus tatap muka. Gak cuma ngetik doang lho. Capee deh... :) paling gampang sich tinggal pake aja webcam di warnet biasanya dah lengkap tuh ada kamera trus headset + mic nya. tinggal pake deh. Tapi kalo komputer rumahan??? jgn harap deh bakalan lengkap... Cuma yang serius pengen chatting aja yang biasanya lengkap.

Kepengen gak sich kira2 kamu tahu gimana tuh Messenger2 bisa nampilin gambar kamu di aplikasi mereka??? Apalagi kalo kita bisa video chat. Wah seru kali yeee. Tapi untuk pokok bahasan kali ini aku cuma kepengen fokus dulu sama gimana caranya gabungin webcam di aplikasi kamu. Ntar kali yee untuk video Chat aku bikin topik baru lagi... Oke Bos???

Pada topik kali ini kita akan berhubungan dengan yang namanya Programming Video For Windows. Sebelum kita memulai, pastikan komputer kamu sudah ada webcamnya. trus kalo bisa dah diinstall juga drivernya. pokoknya kamu bisa lihat wajah kamu sendiri. alias dah dicoba dulu gitu loh.. Cara nyobanya, buka windows explorer (Windows XP yaa). trus lanjutkan klik webcam kamu di bawah drive. kalo gak salah deket2 sama My Network Places deh.. Kalo emang dah bener install drivernya pasti gambar kamu muncul deh... hihihi... lanjut ya..
Aplikasi kita kali ini memanfaatkan Win32 API nya windows XP. Melalui Win32 API ini kita capture gambar video kamu trus dimasukkan ke window aplikasi kamu. Ada beberapa langkah yang harus dilakukan untuk proses capturing ini :
1. Buat window untuk nampung cap
Pada proses ini kita manfaatkan capCreateCaptureWindowA function.
Waktu fungsi ini dipanggil handlenya tuh window baru trus kamu bisa bagusin deh window kamu dengan mengubah-ubah style paramaternya.

lwndC = capCreateCaptureWindowA("My Capture Window", WS_CHILD Or WS_VISIBLE, 0, 0, 160, 120, Me.hwnd, 0)

Ini cuma contoh aja. definisi fungsi, parameter dan konstantanya dah aku buatin di modul VB6.

2. Nyambungin Window yang tadi dah dibuat ke video drivernya
iya dong... kan supaya aplikasi tahu yang mo dicapture tuh webcam yang mana.. tul gak??? Perintahnya adalah :
SendMessage lwnd, WM_CAP_DRIVER_CONNECT, 0, 0. Tapi aku dah modif jadi gampang :

capDriverConnect lwnd, 0
  • passing String ke SendMessage :
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long

Declare Function SendMessageS Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As String) As Long
  • Passing Struktur ke SendMessage :
Dengan menggunakan fungsi Built in VARPTR() bisa diketahui lokasi struktur yang dipassing di memori. Cara gampangnya untuk capture parameter kayak gini deh...

Dim CAP_PARAMS As CAPTUREPARMS
capCaptureGetSetup lwndC, VarPtr(CAP_PARAMS), Len(CAP_PARAMS)
  • Proses Gambar dari Video Stream :
Pertanyaannya adalah bagaimana cara ngambil / capture gambar dari video yang lagi muter / play atau streaming. ribet kan? Udah ada sih fungsinya... namanya Fungsi Call Back. Untuk proses frame2 ketika Mode Preview kamu pake aja capSetCallbackonFrame. Trus kalo pada saat mode Capturenya kamu pake capSetCallbackOnVideoStream. Contohnya

capSetCallbackOnFrame lwndC, AddressOf MyFrameCallback

MyFrameCallback, Itu fungsi yang setiap kali pasti dipanggil kalo ada frame baru yang diterima dari video drivernya. Trus kamu tangkep handlenya yang didefinisikan sebagai VIDEOHDR.
Type VIDEOHDR

lpData As Long '// address of video buffer
dwBufferLength As Long '// size, in bytes, of the Data buffer
dwBytesUsed As Long '// see below
dwTimeCaptured As Long '// see below
dwUser As Long '// user-specific data
dwFlags As Long '// see below
dwReserved(3) As Long '// reserved; do not use

End Type
dimana lpData adalah data aktual dari devicenya. Berikut ini contoh fungsinya yang dah siap dipake.
Function MyFrameCallback(ByVal lwnd As Long, ByVal lpVHdr As Long) As Long

Debug.Print "FrameCallBack"

Dim VideoHeader As VIDEOHDR
Dim VideoData() As Byte

'//Fill VideoHeader with data at lpVHdr
RtlMoveMemory VarPtr(VideoHeader), lpVHdr, Len(VideoHeader)

'// Make room for data
ReDim VideoData(VideoHeader.dwBytesUsed)

'//Copy data into the array
RtlMoveMemory VarPtr(VideoData(0)), VideoHeader.lpData, VideoHeader.dwBytesUsed

Debug.Print VideoHeader.dwBytesUsed
Debug.Print VideoData

End Function
RtlMoveMemory, itu juga harus dideklarasikan dulu lho... kayak gini nih contohnya :

Declare Sub RtlMoveMemory Lib "kernel32" (ByVal hpvDest As Long, ByVal hpvSource As Long, ByVal cbCopy As Long)

Udahan dulu yach... Aku punya source code lengkap untuk webcam sederhana ini... Jgn lupa kasih komentar yg bagus2 yach... Aku kan capek dah nulis lho! hihihi....

Download File :

>>Webcam-Simple
>>Webcam-Advanced
>>Password : sholat

Wass,

Arnie

11 komentar:

Anonim mengatakan...

Mbak,
Aku minta source codenya dong... trus cepet dong mbak topik yang Video Chatnya diterbitkan...
Ditunggu yach...

rasyid78@yahoo.com

Anonim mengatakan...

Slam KEnal,, AKu lg pgn coba bikin akses webcam yang bsa aku streaming dr tempat lain melalui web atau jaringan.. mudah2xan Mbak bisa membantu..

masshen@yahoo.com

Anonim mengatakan...

salam sukses,
saya ucapkan terima kasih banyak, moga ilmu yang disebarkan ini menambah kebarokahan buat Mbak, dan moga sukses selalu

MeLvy mengatakan...

Wahhhh,,,,

makasih bnyk ya mbakk,,,

ni ckup membantu untk progress TA sy nih :)

skali lg makasih ya..

wassalam ^^

nova mengatakan...

berguna banget mbak tutornya.. manteb dah mbak.. eh iya, tapi gimana klo buat lap bahasa multimedia mbak?? yang maen jaringan?? dan menggunakan full duplex dalam streamingnya.. mohon pencerahannya....

Firmansyah Maulana SN mengatakan...

asslamualaikum....
kalo mau nampilin capture 2 webcame di picturebox dalam 1 form gmana?

jadi dalam 1 form ada 2 pisturebox yang nampilin gambar dari 2 webcam

jazakumullah khairan

agus said mengatakan...

klu mo crop image gimana mba..

Unknown mengatakan...

MANTAP

Semoga Allah memberikan pahala yang Besar buat Mbak Arnie

Anonim mengatakan...

waaah....pas banget postingannya ama tugas akhir saya.makasih ya mba.
btw,saya perlu aplikasi capture juga mba,,auto sama pake timer. mba punya contoh source codenya ga mba?
terima kasih

Anonim mengatakan...

Mantap mba... program2nya sangat bermanfaat

Unknown mengatakan...

Salam Kenal semua...
Mbak, ada contoh coding deteksi wajah nya gak..(Terserah deh pake metode yang mana, kayak eigenface boleh juga..)

Thanks before,..
*Email saya : rawikoeriadi@yahoo.co.id

Peraturan & Tata tertib

Bismillahirrohmanirrohiim, Assalamu'alaikum wr. wb,

Sourcecode yang aku sharing di sini dijelaskan terlebih dahulu alurnya disertai pembahasannya dan sifatnya GRATIS dengan syarat :

1. Kamu-kamu smua kasih komentar
2. Setiap pembuatan program dengan sourcecode dari BLOG aku dan sifatnya komersil WAJIB dan KUDU menyertakan NAMA dan BLOG aku lho!
3. Kamu-kamu jangan lupa isi Polling blog aku yach...

NB :
Donasi :
Rek mandiri No. 117-0005202486.
Arniaty Arsyad
















Wassalam,

Arnie