Vous êtes sur la page 1sur 10

Vdeo captura utilizando Java e DirectX Introduo

Este documento demonstra como realizar vdeo captura de uma webCam utilizando DirectX e Java. Tecnologias utilizadas:

JDK 1.6.0_18 http://java.sun.com/javase/downloads/index.jsp DSJ - DirectShow Java wrapper http://www.humatic.de/htools/dsj/download.htm

Leandro Alves ::: Java Development ::: Bacharel em Sistemas de Informao ::: Ps graduando em Desenvolvimento de Sistemas para Web ::: Sun Certified Java Programmer 5.0 leandroalvesbsi@gmail.com

Iniciando projeto
Depois de ter feito o download do DSJ no site da Humatic, que se encontra na verso 0_8_61, copie os arquivos "dsj.jar" e "dsj.dll" para seu classpath de preferncia, no meu caso utilizei "C:\Program Files\Java\jre6\lib\ext". Crie uma classe, dei o nome de "DSJApplet.java", segue o cdigo:
/** * * @author Leandro */ import de.humatic.dsj.CaptureDeviceControls; import de.humatic.dsj.DSCapture; import de.humatic.dsj.DSFilterInfo; import de.humatic.dsj.DSFiltergraph; import de.humatic.dsj.DSGraph; import javax.swing.*; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import javax.imageio.ImageIO; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; /** * This program demonstrates the basics of creating a frame * user interface with a menubar. It also shows how to * add a menubar and dropdown menus to the applet, which wasn't * possible in the basic AWT heavyweight component. **/ public class DSJApplet extends JApplet implements PropertyChangeListener { private DSGraph netGraph = null; private DSFilterInfo dSFilterInfo = null; private DSCapture graph = null; private JComboBox comCameras = new JComboBox(); private JDesktopPane desPreview = new JDesktopPane(); private JInternalFrame frame = new JInternalFrame(); private List<DSFilterInfo> filterInfoList = null; private HashMap<String, DSFilterInfo> hashCams = new HashMap<String, DSFilterInfo>(); /** Build an applet interface with a menubar. A * a drop down menu includes Open/Close items * for opening and closing an instance of ParticleFrame. **/ @Override public void init() { chargeCams(); comCameras.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) { comCamerasActionPerformed(evt); } }); add(java.awt.BorderLayout.NORTH, comCameras); addDesktopPane(); } // init public void addDesktopPane() { desPreview = new JDesktopPane(); desPreview.setBackground(new java.awt.Color(240, 240, 240)); desPreview.setBorder(javax.swing.BorderFactory.createTitledBorder("")); this.add(desPreview); add(java.awt.BorderLayout.CENTER, desPreview); } public List<DSFilterInfo> getVideoDevices() { DSFilterInfo[][] lista = null; try { lista = DSCapture.queryDevices(); } catch (Exception e) { e.printStackTrace(); } return Arrays.asList(lista[0]); } public void chargeCams() { try { filterInfoList = getVideoDevices(); String[] camNames = new String[filterInfoList.size()]; camNames[0] = ""; for (int i = 0; i < filterInfoList.size(); i++) { if (!filterInfoList.get(i).getName().equalsIgnoreCase("none")) { camNames[i + 1] = filterInfoList.get(i).getName(); hashCams.put(filterInfoList.get(i).getName(), filterInfoList.get(i)); } } comCameras.setModel( new javax.swing.DefaultComboBoxModel(camNames));

} catch (Exception e) { e.printStackTrace(); } } private void comCamerasActionPerformed(java.awt.event.ActionEvent evt) { String selectedCam = comCameras.getSelectedItem().toString(); if ((selectedCam != null) && (!selectedCam.trim().equals(""))) { for (JInternalFrame f : desPreview.getAllFrames()) { if (f.getTitle().equalsIgnoreCase(selectedCam)) { return; } } dSFilterInfo = hashCams.get(selectedCam); graph = new DSCapture(DSFiltergraph.RENDER_NATIVE, dSFilterInfo, false, DSFilterInfo.doNotRender(), this);

frame.addInternalFrameListener( new InternalFrameAdapter() { @Override public void internalFrameClosing(InternalFrameEvent e) { finalizeFrame(); } }); frame.setTitle(hashCams.get(selectedCam).getName()); frame.setClosable(true); frame.setSize(620, 440); frame.setResizable(false); frame.add(java.awt.BorderLayout.CENTER, graph.asComponent()); frame.setVisible(true); desPreview.add(frame); JPanel jf = new JPanel(); jf.setLayout(new java.awt.GridLayout(0, 1)); CaptureDeviceControls controls = ((DSCapture) graph).getActiveVideoDevice().getControls(); if (controls != null) {

for (int i = CaptureDeviceControls.BRIGHTNESS; i < CaptureDeviceControls.FOCUS; i++) { try { jf.add(controls.getController(i, 0, true)); } catch (Exception e) { System.out.println("Erro aou inserir controle: " + controls.getController(i, 0, true)); } } } frame.add(java.awt.BorderLayout.WEST, jf); jf.setVisible(true); JButton jb = new JButton("Capturar"); jb.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { try { Object image = graph.getImage(); JFileChooser jf = new JFileChooser(); jf.setMultiSelectionEnabled(false); jf.showSaveDialog(desPreview); if (jf.getSelectedFile() != null) { ImageIO.write((BufferedImage) image, "jpg", jf.getSelectedFile()); } //ImageIO.write((BufferedImage) image, "jpg", new File("C:/Users/Leandro/Desktop/image.jpg")); } catch (IOException ex) { ex.printStackTrace(); } } }); frame.add(java.awt.BorderLayout.SOUTH, jb); } }

public void finalizeFrame() { frame.dispose(); graph.dispose(); graph = null; desPreview.remove(frame); } public void propertyChange(PropertyChangeEvent evt) { } } // class FrameApplet

Compile a classe : javac DSJApplet.java

Sero criados 4 arquivos .class.

Crie um arquivo .jar com os arquivos com os .class gerados. jar cvf DSJApplet.jar *.class

Agora para que nosso applet possa ter alguns privilgios quanto ao acesso a recursos nativos do sistema precisamos assinar nosso jar. keytool -genkey -keystore sample.keystore -storepass storepwd -keypass keypwd -keyalg RSA -alias sample_key -validity 360 -dname "cn=SampleGroup,ou=Sample,c=Bebedouro,s=SP,c=BR" Com esta linha criamos um storage e uma chave, e esta que utilizaremos para assinar nosso jar. Em destaque os nomes e as senhas do keystore e da chave.

Assinando o jar. jarsigner -keystore sample.keystore -storepass storepwd -signedjar DSJAppletAssigned.jar DSJApplet.jar sample_key

Ser solicitada a senha da chave no nosso caso "keypwd". Agora temos nosso jar assinado "DSJAppletAssigned.jar".

Agora crie um html:


<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>DSJApplet</title> </head> <body> <center> <applet code="DSJApplet.class" ARCHIVE="DSJAppletAssigned.jar" width="800" height="600"/> </center> </body> </html>

Pronto... execute sua pgina html e veja o resultado, lembre-se de verificar se o .jar assinado est no mesmo nvel de diretrio que a pgina html. Voc deve aceitar a exceo de segurana, lembrando que nos mesmos criamos nossa assinatura e no uma empresa certificadora.

Carregando...

Selecione a cmera ...

E voil !!

isso ai....

FIM

Leandro Alves ::: Java Development ::: Bacharel em Sistemas de Informao ::: Ps graduando em Desenvolvimento de Sistemas para Web ::: Sun Certified Java Programmer 5.0 leandroalvesbsi@gmail.com

Vous aimerez peut-être aussi