JMF Webcam Capture (Source Code available)

Sebagai salah satu bentuk rasa syukur kepada Allah atas nikmat yang diberikan hari ini :) . saya ingin menyempatkan waktu untuk menjelaskan step by step untuk mengcapture image dari webcam. aplikasi ini sebenarnya tidak persis sama dengan yang pernah saya buat disini, karena saat ini laptop saya masih bermasalah, sehingga saya tidak bisa mengambil source code program yang ada di laptop, jadi saya membuatnya kembali.

prerequisites:

  1. install java + jdk 1.4 > (1.6 / mustang, lebih baik) + netbeans 6.5 (recommended, file yang saya attach adalah netbean project)
  2. jmf telah terinstall,
  3. anda memiliki webcam, merek apapun (dan support rgb  video format), dan telah anda coba dengan menggunakan JMStudio dan dapat bekerja dengan baik.

mengcapture camera dari webcam dengan memanfaatkan library jmf adalah sangat mudah. dan jika anda mencoba search di google, pasti anda akan menemukannya. langkah – langkah nya secara singkat ada 2, pertama mendetect device (camera/ mic), terus membuat player berdasarkan device yang terpilih tersebut dan selanjutnya menampilkannya di layar. thats it. bahkan sebenarnya anda ndak butuh lebih dari sepuluh baris code :) <setelah melalui satu level abstraksi :p >

1. mendeteksi device yang ada

untuk mendeteksi device (driver camera/mic) yang ada pada komputer yang anda perlukan hanya memanggil fungsi getDeviceList, berikut contoh kode programnya

<pre>
<pre>Vector<CaptureDeviceInfo> devices = CaptureDeviceManager.getDeviceList(null);
for (CaptureDeviceInfo cdi : devices){
    System.out.println(cdi.toString());
}</pre>
</pre>

apa yang saya lakukan di kode program tersebut adalah, menyimpan semua device list dengan sembarang format kedalam sebuah Vector generic dan kemudian menampilkan semuanya di laya. kalau anda menjalankan kode program di atas, hasilnya kurang lebih seperti ini (di pc saya ):


DirectSoundCapture : dsound://
LINEAR, 48000.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 48000.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 48000.0 Hz, 8-bit, Stereo, Unsigned
LINEAR, 48000.0 Hz, 8-bit, Mono, Unsigned
LINEAR, 44100.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 44100.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 44100.0 Hz, 8-bit, Stereo, Unsigned
LINEAR, 44100.0 Hz, 8-bit, Mono, Unsigned
LINEAR, 32000.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 32000.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 32000.0 Hz, 8-bit, Stereo, Unsigned
LINEAR, 32000.0 Hz, 8-bit, Mono, Unsigned
LINEAR, 22050.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 22050.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 22050.0 Hz, 8-bit, Stereo, Unsigned
LINEAR, 22050.0 Hz, 8-bit, Mono, Unsigned
LINEAR, 16000.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 16000.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 16000.0 Hz, 8-bit, Stereo, Unsigned
LINEAR, 16000.0 Hz, 8-bit, Mono, Unsigned
LINEAR, 11025.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 11025.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 11025.0 Hz, 8-bit, Stereo, Unsigned
LINEAR, 11025.0 Hz, 8-bit, Mono, Unsigned
LINEAR, 8000.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 8000.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 8000.0 Hz, 8-bit, Stereo, Unsigned
LINEAR, 8000.0 Hz, 8-bit, Mono, Unsigned

JavaSound audio capture : javasound://44100
LINEAR, 44100.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 44100.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 22050.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 22050.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 11025.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 11025.0 Hz, 16-bit, Mono, LittleEndian, Signed
LINEAR, 8000.0 Hz, 16-bit, Stereo, LittleEndian, Signed
LINEAR, 8000.0 Hz, 16-bit, Mono, LittleEndian, Signed

vfw:Microsoft WDM Image Capture (Win32):0 : vfw://0
RGB, 320x240, Length=230400, 24-bit, Masks=3:2:1, PixelStride=3, LineStride=960, Flipped
RGB, 160x120, Length=57600, 24-bit, Masks=3:2:1, PixelStride=3, LineStride=480, Flipped
RGB, 176x144, Length=76032, 24-bit, Masks=3:2:1, PixelStride=3, LineStride=528, Flipped
RGB, 352x288, Length=304128, 24-bit, Masks=3:2:1, PixelStride=3, LineStride=1056, Flipped
RGB, 640x480, Length=921600, 24-bit, Masks=3:2:1, PixelStride=3, LineStride=1920, Flipped
<div></div>

hasilnya bayak karena saya mengenumerasi semua device (dengan passing parameter null ) yang ada. anda tidak perlu pusing memikirkan bagaimana cara memilih salah satu device tersebut. karena kita akan mengcapture gambar maka kita akan menggunakan device kamera yang ini vfw:Microsoft WDM Image Capture (Win32):0 : vfw://0

kamera yang saya pakai support untuk beberapa resolusi (ukuran capture- widthxheight), seperti anda lihat di atas, dan tentu anda dapat memilih rosulusi yang tepat buat program anda nanti.

2. melakukan capture

seperti yang pernah saya katakan sebelumnya, bagian capture kamera itu sangat trivial, (search di google dan anda akan menemukannya :p) , hehe, maksudnya bukan itu, maksudnya anda hanya butuh sedikit kode program  sederhana untuk melakukannya. pertama, setelah anda memilih device mana yang anda gunakan, anda tinggal membuat instan Player berdasarkan informasi device tersebut dan menyuruhnya mengerjakan sisa pekerjaan selanjutnya, dan anda tinggal menungguinya misalnya menggunakan JPanel.

begitu saja ? ya, benar cuman begitu thok :), nah mari kita lihat contoh kode programnya:

di = CaptureDeviceManager.getDevice(devicename);

ml = di.getLocator();

try{

player = Manager.createRealizedPlayer(ml);

player.start();

panel = new JPanel();

panel.setSize(300, 300);

if ((comp = player.getVisualComponent()) != null){

panel.add(comp, BorderLayout.NORTH);

this.setComponent(panel);

this.getComponent().revalidate();

getComponent().repaint();

}

}catch(Exception e){

e.printStackTrace();

}

pada kode program itu, setelah saya menentukan device mana yang saya pakai (devicename), saya membuat instan sebuah mediaLocator yang akan dipakai oleh instan Player untuk membuat player yang Realized (ini salah satu state, untuk dapat mengcapture anda harus memastikan bahwa player telah realized).

nah, inilah salah satu tampilan capturenya:

D + keyboard pc yang lagi kupakai

ada lagi

result1

masih kurang jelas ya? ada lagi nih yang lain :)

result

3. menyimpan sebagai still image di hard disk (jpg)

mungkin anda tidak puas hanya melihat hasil capture webcam anda, dan anda ingin juga menyimpannya seperti yang saya lakukan diatas (lihat gak ada frame & windownya, beda dengan posting saya terdahulu), langkahnya juga tidaklah terlalu rumit, yang anda butuhkan adalah JPEGImageEncoder, untuk melakukan encoding byte data setelah digrab oleh FrameGrabbingControl dalam format jpeg, dan tentu saja i/o stream untuk menyimpan file.  ringkasan codenya kurang lebih begini:

private void SaveFrame(java.awt.event.ActionEvent evt) {
Image image;
FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame();
// Convert it to an image
btoi = new BufferToImage((VideoFormat)buf.getFormat());
image = btoi.createImage(buf);

        // save image,
JFileChooser jf = new JFileChooser("Save Capture");
ExtensionFileFilter filefilter = new ExtensionFileFilter(null,new String[]{"jpg", "jpeg"});
jf.addChoosableFileFilter(filefilter);

int option = jf.showSaveDialog(null);
if (option == JFileChooser.APPROVE_OPTION){
if (jf.getSelectedFile() != null)
saveImage(image,jf.getSelectedFile().getPath());
}
}


public static void saveImage(Image img, String s)
{
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bi.createGraphics();
g2.drawImage(img, null, null);

FileOutputStream out = null;
try
{
out = new FileOutputStream(s);
}
catch (java.io.FileNotFoundException io)
{
io.printStackTrace();
}

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(0.5f,false);
encoder.setJPEGEncodeParam(param);

try
{
encoder.encode(bi);
out.close();
}
catch (java.io.IOException io)
{
io.printStackTrace();
}
}

panjang amat? nggak juga, cuman beberapa baris intinya.

seperti yang sudah saya jelaskan, yang dilakukan hanya grab, encode & save. well done

4. menyimpan sebagai video (avi atau mov / apple quicktime)

nah ini PR buat anda, dan kesempatan bagi saya untuk menambah koleksi postingan blog di masa datang :p , sebagai kenang – kenangan ini aku kasih video capture dalam format mov dan avi + source lengkap program

1. video capture1 (.avi) ~ 1.3 MB

2. video capture2 (.mov) ~ 556 KB

3. camcapturezip  (.zip) – rename .doc jadi .zip

45 thoughts on “JMF Webcam Capture (Source Code available)

  1. gan cukup menarik ni Script, kebetulan ane lg nyari buat captur foto dari webcame, dan langsung bisa di save ke jpg.. ane pake jmyron,, cuman blum nemu buat save to database y tw ke jpg., ane mau nyoba souce code yg nie
    kalo bisa send to my email y : …
    tank sblm y .. :)

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s