ARCmop Java Programacion Solaris Linux

Java-linux-programacion

Java: LTI-CIVIL, usando video desde cámara USB, adiós a JMF

Posted by Cmop en julio 3, 2010

lti civil

lti civil

Hola, estuve probando JMF, después de correr algunas aplicaciones me di cuenta de lo limitado que es en cuanto al soporte de Hardware, pues conecte una Cámara VIMICRO 305 y no la reconoció, estoy avanzando un pequeño programa que se dedique a la vigilancia algo asi como Jvigilancia, pero que soporte muchos más dispositivos.

Des esta manera encontré a LTI-CIVIL, el cual es una biblioteca Java para capturar imágenes de una fuente de vídeo como una cámara USB. Proporciona una API sencilla y no depende de o el uso de JMF! es por ello que me descargué el paquete y al querer buscar un manual o tutorial o algun pequeño How To, no lo encontré, pero como es Software Libre, esta me proporciona los fuentes, revisé los fuentes de los ejemplos y me di cuenta básicamente de lo que debía hacer para realizar un Player.

Al parecer no existe el streaming, sino que un Evento (newImage) es escuchado y este será el encargado de transferir la nueva imagen que llega desde la camara a donde nosotros lo deseemos, es decir lo que mostraremos será una secuencia de imágenes las cuales irán apareciendo dando la sensación de video. Esto tiene la ventaja que al tomar una foto la tarea se vuelve sencillísima sin necesidad de un “FrameGrabbing” como hacíamos en JMF.

El esquema básico a continucación describe como lo he hecho y he visto que lo han hecho los chicos de FMJ.

LTI_CIVIL

LTI_CIVIL

¿Que quiere decir sincronizado?, pues que aplicaremos una exclusión sobre la llamada de un método para evitar accesos no deseados a él, esto se logra a través de la palabra reservada synchronized

Otra cosa es que, cuando vamos a realizar la llamada, al método que repinta la imagen lo debemos hacer implementando a la interface Runnable, esto para realizar la tarea independiente de la interface gráfica y dar estabilidad a la aplicación.

LTI-CIVIL es multiplataforma, pero cuenta con librerías nativas realizadas para cada Sistema Operativo distinto, esto es Windows, GNU/Linux, MAC OS, de esta manera que se obtiene un comportamiendo adecuado en cuanto a calidad, velocidad en las imágenes, pero esta librerías nativas deben especificarse a través de una propiedad al ejecutar la aplicación, con el conocido parametro -D, este es un ejemplo: -Djava.library.path=”c:/win32-x86″.

Yo he modificado el esquema de arriba, usando la Interface Observer y la clase Observable, ambas muy utiles a la hora de programar. Para los que no las conocen éstas nos permiten saber cuando se realizo un cambio  en algun objeto (Observable) y tratarlo de la mejor manera segun se decidad en el Observador (Observer), de ésta manera puedo tener varios Observers sobre el objeto observable: la imagen que proviene desde la cámara.

Colocaré un código de ejemplo que realicé: aqui, no se trata de un ejemplo complejo, si quieres cambiar de cámara  de donde se tomarán las imagenes deberán cambiar la línea numero 63:  for (int i = 1; i < list.size(); ++i), en donde cambian el 1 por 0,2,3 dependiendo del número de cámaras que tengan conectadas al equipo.

Espero se haya entendido como usarlo y cualquier duda estoy para ayudar.

34 comentarios to “Java: LTI-CIVIL, usando video desde cámara USB, adiós a JMF”

  1. Oscar Ordoñez said

    Navengando por la red me encontre tu articulo el cual me ayudo bastante, sin embargo no logro comprender muy bien el funcionamiento, descargue tus archivos y puse la carpeta native que viene con el LTI el jar generado de tu aplicacion lo ejecuto y me puestra una aplicacion muy diferente a la tuya que puedo estar haciendo mal?

    • Cmop said

      Hola al decir diferente, a que te refieres?, puedo entender que te refieres a las capturas de mis articulos anteriores “Toma Foto” y “Captura Foto”, esta aplicación es muy sencilla “no” es una adaptación de las anteriores a LTI.
      Saludos y espero tu respuesta.

      • Oscar Ordoñez said

        Bueno Me refiero a lo siguiente, yo baje el LTI-CIVIL el trae consigo unos ejemplos, posteriormente descargue tu ejemplo lo cargue en netbeans como un proyecto y al tratar de ejecutarlo me generaba error. El error primero debido a que no habia cargado el jar necesario al hacerlo se eliminaron los errores pero en ejecucion como especificas se debe indicar a la maquina virtual donde esta la libreria.

        Ingrese la instruccion que mencionas antes para esto, pero cuando se ejecuta no se esta ejecutando tu aplicacion, sino que me ejecuta algun tipo de aplicacion que se encuentra como embevida dentro de la DLL civil.dll y si quito esta dll me genera un error indicandome que falta esta dll.

        La verdad estoy buscando un ejemplo sencillo de como configurar y que librerias o .jar debo usar para poder trabajar sin complicaciones. En todo caso tu articulo me fue muy util y me ha ayudado mucho con mi problema de camaras.

        • Cmop said

          Me alegra que te haya ayudado, mira el problema puede ser que en las propiedades del Proyecto en el apartado “Run” allí se encuentra la propiedad donde se indica la ubicación de la librería nativa.
          Pero segun entiendo tu si has podido configurarla sin problemas, tu dices que parece que se ejecuta una aplicación embebida, creo que dices eso por la sencillez de la interfaz que es similar a la que viene predefinida en LTI como ejemplo, pero si miras en los fuentes el código y la lógica de Observador y Observable es distinta al ejemplo que viene en LTI.
          saludos.

  2. Juan said

    Gracias por el aporte

  3. Puede utilizarse esto para un link de una pagina web por ejemplo http://www.opentopia.com/showcam.php?camid=5890 y muy buenos tus aportes! Gracias!!

  4. cesar said

    hola, estan muy buenas tus publicaciones,
    quisiera saber si me puedes ayudar.
    Mira lo que necesito hacer es lo siguiente.

    capturar video en tiempo real de una cámara tcp/ip. analizar frame a frame, es decir poder compararlos, supongo que para eso, requiero analizar pixel a pixel de cada frame.
    PUEDO HACER TODO LO ANTERIOR CON JMF? sino, con que podría hacerlo.

    saludos cordiales.

  5. Yeiner said

    Cmop ya revise el post hice todo al momento de correr el projecto me sale la ventana normal, pero no me muestra el video😦 estoy toda la mañana con esto y no se que falla. Por cierto en la importacion de librerias me sale subrayado “import com.lti.civil.webcam.StoreMostRecent_CaptureObserver;” y me dice “unused import”

  6. Javier said

    Hola César:

    Estoy con tu artículo.
    Muy bueno por cierto el aporte.
    Esta librería no sé cual es la diferencia con JMF.
    Esta permite capturar camaras USB, el JMF no puede? o es sólamente por que no detecta algunas cámaras?.

    Otro punto y no te molesto mas, corro tu aplicación y no me detecta mi webcam que tengo incorporada en mi portatil. No es USB, no debería capturarlo?

    Mil gracias.

  7. Michael said

    Hola no puedo hacer correr el programa, me sale este error:

    Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
    at miLTI.capturar(miLTI.java:90)
    at miLTI.(miLTI.java:48)
    at miLTI$2.run(miLTI.java:175)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

    por favor necesito que funcione proque es parte de mi proyecto final para curso de programacion..

    • package gafetes;

      import com.lti.civil.CaptureDeviceInfo;
      import com.lti.civil.CaptureException;
      import com.lti.civil.CaptureObserver;
      import com.lti.civil.CaptureStream;
      import com.lti.civil.CaptureSystem;
      import com.lti.civil.CaptureSystemFactory;
      import com.lti.civil.DefaultCaptureSystemFactorySingleton;
      import com.lti.civil.Image;
      import com.lti.civil.awt.AWTImageConverter;

      import java.awt.BorderLayout;
      import java.awt.Container;
      import java.awt.Cursor;
      import java.awt.GridLayout;

      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import java.awt.event.WindowAdapter;
      import java.awt.event.WindowEvent;
      import java.awt.image.BufferedImage;
      import java.io.File;
      import java.util.List;
      import java.util.logging.Level;
      import java.util.logging.Logger;

      import javax.swing.ImageIcon;
      import javax.swing.JButton;
      import javax.swing.JFileChooser;

      import javax.swing.JFrame;
      import javax.swing.JLabel;

      import javax.swing.JMenu;
      import javax.swing.JMenuBar;
      import javax.swing.JMenuItem;
      import javax.swing.JOptionPane;
      import javax.swing.JPanel;

      import save.SaveImage;
      import library.JavaLibraryPath;

      public class captura extends JFrame {

      private JPanel webCam = null;
      private JMenuBar menuBar = null;
      private JMenu menuArchivo = null;
      private JMenu menuDeviceCam = null;
      private JMenuItem menuItemSalir = null;
      private JMenuItem menuItemBrowser = null;
      private JMenuItem menuItemCam = null;
      private JButton bntRemoveImg = null;
      private JButton bntCapturarImg = null;
      private boolean active = false;
      private CaptureSystemFactory factorys = null;
      private CaptureSystem system = null;
      private CaptureStream captureStream;
      private List list = null;
      private ImageIcon picture;
      private JLabel contenPicture = null;
      private Image imagen = null;
      private int count = 0;
      private String path = “…”;
      private String formato = “jpeg”;

      public captura() throws CaptureException {
      super();
      controller();
      setTitle(“Captura de Foto”);
      setResizable(false);
      setSize(500, 300);
      Container panelPrincipal = getContentPane();
      panelPrincipal.setLayout(new BorderLayout());
      panelPrincipal.add(BorderLayout.NORTH, getMenuBars());
      addWindowListener(new WindowAdapter() {

      @Override
      public void windowClosing(WindowEvent e) {
      if (captureStream != null) {
      try {
      captureStream.stop();
      captureStream.dispose();
      active = false;
      } catch (CaptureException ex) {
      //
      }
      }
      System.exit(0);
      }
      });
      webCam = new JPanel();
      panelPrincipal.add(BorderLayout.CENTER, webCam);
      webCam.setVisible(true);
      JPanel botones = new JPanel();
      botones.setLayout(new GridLayout(1, 2));
      panelPrincipal.add(BorderLayout.SOUTH, botones);

      botones.add(getBntCapturarImg());
      botones.add(getBntRemoveImg());
      setVisible(true);
      }

      private void controller() throws CaptureException {
      try {
      factorys = DefaultCaptureSystemFactorySingleton.instance();
      system = factorys.createCaptureSystem();
      system.init();
      list = system.getCaptureDeviceInfoList();
      } catch (CaptureException ex) {
      System.out.println(“Error: ” + ex.toString());
      //ex.printStackTrace();
      }
      }

      private JButton getBntCapturarImg() {
      if (bntCapturarImg == null) {
      bntCapturarImg = new JButton();
      bntCapturarImg.setText(“Capturar”);
      bntCapturarImg.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent e) {
      try {
      if (captureStream != null) {
      captureStream.stop();
      BufferedImage bimg = new BufferedImage(captureStream.getVideoFormat().getWidth(), captureStream.getVideoFormat().getHeight(), BufferedImage.TYPE_3BYTE_BGR);
      bimg = AWTImageConverter.toBufferedImage(imagen);
      SaveImage save = new SaveImage();
      save.Save(bimg, path + “\\foto” + (count = count + 1) + “.” + formato, formato);
      }
      } catch (CaptureException ex) {
      //ex.printStackTrace();
      }
      }
      });
      Cursor cursor = bntCapturarImg.getCursor();
      bntCapturarImg.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
      bntCapturarImg.setToolTipText(“Captura foto de la camara”);
      }
      return bntCapturarImg;
      }

      private JButton getBntRemoveImg() {
      if (bntRemoveImg == null) {
      bntRemoveImg = new JButton();
      bntRemoveImg.setText(“Nueva”);
      bntRemoveImg.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent e) {
      try {
      if (captureStream != null) {
      captureStream.start();
      }
      } catch (CaptureException ex) {
      //ex.printStackTrace();
      }
      }
      });
      Cursor cursor = bntRemoveImg.getCursor();
      bntRemoveImg.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
      bntRemoveImg.setToolTipText(“Nueva foto”);
      }
      return bntRemoveImg;
      }

      private JMenuBar getMenuBars() {
      if (menuBar == null) {
      menuBar = new JMenuBar();
      menuBar.add(getMenuArchivo());
      menuBar.add(getMenuDevieCam());
      }
      return menuBar;
      }

      private JMenu getMenuArchivo() {
      if (menuArchivo == null) {
      menuArchivo = new JMenu();
      menuArchivo.setText(“Arhivo”);
      menuArchivo.add(getMenuItemBrowser());
      menuArchivo.add(getMenuItemSalir());
      }
      return menuArchivo;
      }

      private JMenuItem getMenuItemSalir() {
      if (menuItemSalir == null) {
      menuItemSalir = new JMenuItem();
      menuItemSalir.setText(“Salir”);
      menuItemSalir.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent e) {
      if (captureStream != null) {
      try {
      captureStream.stop();
      captureStream.dispose();
      active = false;
      } catch (CaptureException ex) {
      //
      }
      }
      System.exit(0);
      }
      });
      Cursor cursor = menuItemSalir.getCursor();
      menuItemSalir.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

      }
      return menuItemSalir;
      }

      private JMenuItem getMenuItemBrowser() {
      if (menuItemBrowser == null) {
      menuItemBrowser = new JMenuItem();
      menuItemBrowser.setText(“Examinar”);
      menuItemBrowser.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent e) {
      File file = new File(path);
      JFileChooser browser = new JFileChooser(file);
      browser.setDialogTitle(“Guardar en….”);
      browser.setCurrentDirectory(file);
      browser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
      browser.setApproveButtonText(“Selecionar”);
      int seleccion = browser.showOpenDialog(null);

      if (seleccion == JFileChooser.APPROVE_OPTION) {
      file = browser.getSelectedFile();
      }
      if (seleccion == JFileChooser.ABORT || seleccion == JFileChooser.CANCEL_OPTION || seleccion == JFileChooser.ERROR_OPTION) {
      System.out.println(“El usuario cancelo”);
      file = new File(path);
      }
      path = file.toString();
      }
      });
      Cursor cursor = menuItemBrowser.getCursor();
      menuItemBrowser.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
      menuItemBrowser.setToolTipText(“Selecciona”);
      }
      return menuItemBrowser;
      }

      private JMenu getMenuDevieCam() {
      if (menuDeviceCam == null) {
      menuDeviceCam = new JMenu();
      menuDeviceCam.setText(“Video”);
      getDevice();
      menuDeviceCam.setToolTipText(“Dispositivo de para captura de foto”);
      }
      return menuDeviceCam;
      }

      private JMenuItem getMenuItemDevieCam(String nombre) {
      menuItemCam = new JMenuItem();
      menuItemCam.setText(nombre);
      menuItemCam.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent e) {
      try {
      if (captureStream != null) {
      captureStream.stop();
      captureStream.dispose();
      }
      System.out.println((String) e.getActionCommand());
      factorys = DefaultCaptureSystemFactorySingleton.instance();
      system = factorys.createCaptureSystem();
      system.init();
      for (int index = 0; index 0) {
      for (int i = 0; i < list.size(); i++) {
      CaptureDeviceInfo info = (CaptureDeviceInfo) list.get(i);
      menuDeviceCam.add(getMenuItemDevieCam(info.getDescription()));
      menuDeviceCam.updateUI();
      }
      } else {
      String mensaje = "No se enuentran dispositivos de captura de video,\n El problema puede ser causado por lo motivos que acontinuacion se enlistan:\n \t° El dispositivo no se encuentra conectado al ordenador \n \t° El dispositivo no cuenta con el driver correcto \n";
      JOptionPane.showMessageDialog(null, mensaje, "Error", JOptionPane.ERROR_MESSAGE);
      }
      }

      class MyObserver implements CaptureObserver {

      public void onNewImage(CaptureStream stream, Image image) {
      if (active) {
      imagen = image;
      BufferedImage bimg = null;
      bimg = AWTImageConverter.toBufferedImage(image);

      if (contenPicture == null) {
      webCam.setLayout(new BorderLayout());
      picture = new ImageIcon(bimg);
      contenPicture = new JLabel(picture);
      } else {
      picture = new ImageIcon(bimg);
      contenPicture.setIcon(picture);
      }
      webCam.add(BorderLayout.CENTER, contenPicture);
      webCam.updateUI();
      }
      }

      public void onError(CaptureStream stream, CaptureException ce) {
      //ce.printStackTrace();
      JOptionPane.showMessageDialog(null, "Ocurrio un error al obtener imagen del dispositivo", "Error", JOptionPane.ERROR_MESSAGE);
      }
      }

      public static void main(String[] args) {
      String lticivilHome = "";
      String os = System.getProperty("os.name");
      File file = null;
      System.out.println(os);
      if (os.indexOf("Windows") != -1) {
      lticivilHome="C:\\win32-x86";
      file = new File(lticivilHome);
      } else if (os.indexOf("Linux") == -1) {
      lticivilHome += "";
      }

      try {
      System.out.println(file.toString());
      JavaLibraryPath.add(file);
      } catch (Exception e) {
      //e.printStackTrace();
      System.exit(0);
      }

      try {
      captura c = new captura();
      c.setVisible(true);
      } catch (CaptureException ex) {
      //ex.printStackTrace();
      }
      }
      }

      package save;

      import java.awt.RenderingHints;
      import java.awt.geom.AffineTransform;
      import java.awt.image.AffineTransformOp;
      import java.awt.image.BufferedImage;
      import java.io.File;
      import java.io.IOException;
      import javax.imageio.ImageIO;

      public class SaveImage {

      private RenderingHints opciones = new RenderingHints(null);

      public SaveImage() {
      opciones.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      opciones.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
      opciones.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
      opciones.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
      opciones.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
      opciones.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
      opciones.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
      opciones.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
      }

      public String[] getFormatAvailable() {
      return ImageIO.getReaderFormatNames();
      }

      public BufferedImage escalarATamanyo(final BufferedImage imagen, final int maxWidth, final int maxHigh) {

      if (imagen == null || maxHigh == 0 || maxWidth == 0) {
      return null;
      }

      int anchoImagen = imagen.getHeight();
      int altoImagen = imagen.getWidth();

      double escalaX = (double) maxWidth / (double) anchoImagen;
      double escalaY = (double) maxHigh / (double) altoImagen;

      double fEscala = Math.min(escalaX, escalaY);

      return escalar(fEscala, imagen);
      }

      public BufferedImage escalar(final double factorEscala, final BufferedImage srcImg) {
      if (srcImg == null) {
      return null;
      }

      if (factorEscala == 1) {
      return srcImg;
      }

      AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(factorEscala, factorEscala), opciones);

      return op.filter(srcImg, null);
      }

      public boolean Save(final BufferedImage imagen, final String rutaFichero, final String formato) {

      if (imagen != null && rutaFichero != null && formato != null) {

      try {
      ImageIO.write(imagen, formato, new File(rutaFichero));
      return true;
      } catch (IOException e) {
      // Fallo al guardar
      return false;
      }
      } else {
      // Fallo en los parametros
      return false;
      }
      }
      }

      Te dejo este codigo si funciona cualquier duda publicala aqui o pasamela a mi facebook

  8. Milton said

    Alguien sabe si esta libreria acepta q trabajemos con mas de una camara web al mismo tiempo? porque con jmf eso no es posible por lo q tengo entendido, gracias!

  9. Marturet said

    hola amigo antes que nada agradecerte por todos los post que has hecho y por responderle a los demas espero me puedas ayudar a mi.te queria preguntar si existe la forma empleando alguna de las librerías que has usado como son JMF, LTI-CIVIL o MFJ. si con alguna de ellas se pueden ver varias camaras web porque con JMF hago todo lo que explicas en los post anteriores. tengo 3 camaras 2 iguales y otra diferente. las conecto a las 3 y le doy en detectar device y solo sale una sale esto vfw://Microsoft WDM Image Capture (Win32):0 osea que solo ve una sola cam. estoy usando camaras web con cable usb. Con respeto a LTI.CIVIL. la descargue y añadi como archivo jar al proyecto que colocaste mas arriba y no me funciona y eso que tiene las 3 camaras coloque en donde mencionas “cambiar la línea numero 63: for (int i = 1; i < list.size(); ++i), en donde cambian el 1 por 0,2,3 dependiendo del número de cámaras que tengan conectadas al equipo.". coloque el numero 3 por tener 3 camaras y nada solo sale la ventana con el panel pero se queda pegado el codigo aqui en esta linea dispositivos = fabrica.createCaptureSystem(); en la clase milTI. No da errores ni nada solo no hace mas nada después de esa linea que crees que pueda ser

  10. Jose Martinez said

    Como Activar 2 camaras a la vez en netbeans?

  11. Daniel Alejandro said

    Olle yo tengo una duda.

    Mira la cuestion es que quiero realizar un programa que realice la toma de fotografia pero no quiero utilizar una camara web, quiero utilizar una camara digital ya sea nikon, canon, sony o etc que sea digital pero no web cam. se podra realizar con el jmf o el que recomiendas lti-civil

    • Cmop said

      En ese caso con lti-civil

      • Daniel Alejandro said

        No logro que funcione el ejemplo que indicas marca un error. Creo que es porque no ingreso -Djava.library.path=”c:/win32-x86″. pero no funciona segun yo cabie y lo ejecuto asi java -jar C:\Users\Gaona\Documents\NetBeansProjects\miLTI\miLTI\dist\miLTI.jar -Djava.library.path=”C://win32-x86″ pero no logro que funcione que me esta fallando.

        Nota las libreias que ingresas al path ya estan en esa ruta

        • Daniel Alejandro said

          Crees que funcione igual realizar el siguiete codigo System.setProperty(“java.library.path”,”C:\\win32-x86″); pra registrar las librerias

  12. Daniel Alejandro said

    Listo aqui esta la respuesta para cargar la library.path desde codigo sin tener que agregarlo con las instruccion -D de java: les dejo la clase de y un ejemplo de como se utiliza
    package library;

    import java.io.File;
    import java.lang.reflect.Field;
    import java.util.Properties;

    public class JavaLibraryPath {

    public static void add(File path) throws Exception {
    String newLibraryPath = System.getProperty(“java.library.path”);
    if (newLibraryPath == null || newLibraryPath.length() < 1) {
    newLibraryPath = path.getCanonicalPath();
    } else {
    newLibraryPath += File.pathSeparator
    + path.getCanonicalPath();
    }

    Field f = System.class.getDeclaredField("props");
    f.setAccessible(true);
    Properties props = (Properties) f.get(null);

    props.put("java.library.path", newLibraryPath);

    Field usr_pathsField =
    ClassLoader.class.getDeclaredField("usr_paths");
    usr_pathsField.setAccessible(true);
    String[] usr_paths = (String[]) usr_pathsField.get(null);
    String[] newUsr_paths = new String[usr_paths == null ? 1
    : usr_paths.length + 1];
    if (usr_paths != null) {
    System.arraycopy(usr_paths, 0, newUsr_paths,
    0, usr_paths.length);
    }
    newUsr_paths[newUsr_paths.length – 1] = path.getAbsolutePath();
    usr_pathsField.set(null, newUsr_paths);
    }
    }

    Asi la incluyes en tu main antes de invocar la los dispositivos para evitar que mande errores.
    String lticivilHome = "";
    String os = System.getProperty("os.name");
    File file = null;
    System.out.println(os);
    if (os.indexOf("Windows") != -1) {
    lticivilHome="C:\\win32-x86";
    file = new File(lticivilHome);
    } else if (os.indexOf("Linux") == -1) {
    lticivilHome += "";
    }

    try {
    System.out.println(file.toString());
    JavaLibraryPath.add(file);
    } catch (Exception e) {
    //e.printStackTrace();
    System.exit(0);
    }
    Asi funciona y ya cuando ejecuten el archivo jar funcionara

  13. César said

    Gracias por el tutorial para realizar esto pero no lo hago funcionar en ubuntu 10.04 con tu código podrias ayudarme donde es que tengo que colocar las librerias gracias.

  14. Jesús said

    No me funciona, ya puse los resolves y los clasáths pero solo me muestra un frame y me da error con imports como los de quicktime y cosas así , además de los componentes de eclipse, me dice que no existen!!!

    • Cmop said

      Debes crear una libreria y en ella incluir los jars del LTI y luego agregas la libreria a tu proyecto, eso resolvera el problema de las dependencias, saludos

  15. Erick said

    Hola que tal, primero que nada me gustaría darte las gracias, tus post anteriores me han sido de mucha ayuda, pero tengo una pregunta en jmf la mayor resolución de video que puedes adquirir es de 600×480, hay alguna forma de adquirir video con una mayor resolución, cuento con una cámara de Microsoft de hasta 10 Megapixeles, necesito aumentar la resolución debido a que estoy trabajando con procesamiento de imágenes

  16. Oscar Ordoñez said

    hola, quisiera saber si alguien me puede indicar como logro ejecutar desde netbeans, he logrado que se ejecute pero usando el jar y linea de comandos es decir algo asi: java -classpath demo.jar -Djava.library.path=”native/win32-x86″ com.lti.civil.swing.CaptureFrame, pero quisiera poder hacer que se ejecute la aplicacion correctamente desde netbeans y no he logrado determinar que tipo de configuracion debo realizar, si alguien me puede ayudar con esto lo agradezco.

    • Ricardo said

      No se muy bien en netbeans como es el procedimiento pero debe ser similar… en eclipse te vas a click derecho y run configuration, en la solapa de arguments, en la parte de VM arguments, pegas esto: -Djava.library.path=”c:\win32-x86″
      Y listo con eso al hacer run java aplication te toma esos valores…

  17. Luis said

    hola como estas? espero que bien me interesa mucho hacer esto un ejemplo lo e intentado abrirlo en linux debian y no he podido si me puedes ayudar te agradeceria mucho saludos y gracias

  18. Salvador said

    Para los que como yo no entendieron eso del -Djava.library.path, solo tienen que importar los .dll con eclipse.

    PD. El ejemplo de este post no es eficiente, consume toda la memoria y manda el mensaje java.lang.OutOfMemoryError: Java heap space. Lo que hice fue tomar el ejemplo que trae la librería y adaptarlo.

  19. Jesus Ayala said

    es posible hacer esto funcionar desde un applet en HTML??? necesito hacer funcionar la aplicacion desde un servidor para tomar fotos en un Web Browser

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: