Vídeo captura utilizando Java e DirectX Introdução Este documento demonstra como realizar vídeo 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 Informação ::: Pós 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 versão 0_8_61, copie os arquivos "dsj.jar" e "dsj.dll" para seu classpath de preferência, no meu caso utilizei "C:\Program Files\Java\jre6\lib\ext". Crie uma classe, dei o nome de "DSJApplet.java", segue o código: /** * * @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 Serão 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 privilégios 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 página html e veja o resultado, lembre-se de verificar se o.jar assinado está no mesmo nível de diretório que a página html. Você deve aceitar a exceção de segurança, lembrando que nos mesmos criamos nossa assinatura e não uma empresa certificadora.
Carregando... Selecione a câmera... E voilà!!
É isso ai... FIM Leandro Alves ::: Java Development ::: Bacharel em Sistemas de Informação ::: Pós graduando em Desenvolvimento de Sistemas para Web ::: Sun Certified Java Programmer 5.0 leandroalvesbsi@gmail.com