2012-09-16 3 views
2

Ce serait génial si je pouvais obtenir des conseils sur mon problème: Je travaille avec une application qui devrait montrer à l'utilisateur une liste de caméras PC attachées. Par exemple, en utilisant mon ordinateur portable, j'ai une caméra Web intégrée et une caméra USB. Lors de l'exécution de l'application, l'utilisateur devrait être en mesure de sélectionner le périphérique souhaité et de créer une photo avec.Application portable sur Java pour travailler avec caméra Web

J'ai travaillé avec ce problème pendant plusieurs jours et j'ai étudié en utilisant les frameworks existants suivants: JMF, FMJ, VLCJ, Xuggler, JMyron, JavaFX, JavaCV.

Certains d'entre eux ont été dépréciés; D'autres nécessitent l'installation du SDK pour chaque PC client. La principale exigence de mon application est la portabilité, cependant, et cela me fait porter d'utiliser des SDK externes.

Est-il possible d'effectuer cette tâche uniquement avec Java?

Maintenant mon application ne devrait fonctionner que sur Windows. Alors, pourrais-je avoir quelques conseils sur la façon de résoudre mon problème?

Cordialement, Evgeniy

+0

Xuggler n'est ni obsolète ni ne nécessite d'installation. – LanguagesNamedAfterCofee

+0

@LanguagesNamedAfterCofee, merci pour votre commentaire. Comme je sais, Xuggler produit des API pour capturer la caméra Web par nom de pilote et nom de périphérique. Si vous me donnez un conseil, comment puis-je les obtenir sur Windows OS, ce serait génial. Selon ce fil groups.google.com/forum/?fromgroups=#!topic/xuggler-users/... Xuggler ne prend pas en charge le travail avec les webcams correctement. – evgeniy44

Répondre

0

Je suis désolé que j'ai posté la question si tôt. Je viens de résoudre ce problème. J'ai utilisé LTI-CIVIL. Il n'a pas été mis à jour depuis 5 ans ... En tout cas, ça marche bien pour tous mes web camers. J'ai changé un peu l'un des exemples d'utilisation pour basculer entre les appareils existants. Voici mon code:

public class CaptureFrame extends ImageFrame 
{ 
private Map <String, String>cams = new HashMap<String, String>(); 
public static void main(String[] args) throws CaptureException 
{ 
    new CaptureFrame(DefaultCaptureSystemFactorySingleton.instance()).run(); 
} 

private CaptureSystem system; 
private CaptureStream captureStream; 
private final CaptureSystemFactory factory; 
private volatile boolean disposing = false; 

public CaptureFrame(CaptureSystemFactory factory) 
{ 
    super("LTI-CIVIL"); 
    this.factory = factory; 
} 

public void run() throws CaptureException 
{ 
    initCapture(); 

    setLocation(200, 200); 
    addWindowListener(new WindowAdapter() 
    { 
     public void windowClosing(WindowEvent e) 
     { 
      try 
      { 
       disposeCapture(); 
      } catch (CaptureException e1) 
      { 
       e1.printStackTrace(); 
      } 
      System.exit(0); 
     } 
    }); 
    setVisible(true); 
    pack(); 

    system = factory.createCaptureSystem(); 
    system.init(); 
    List <CaptureDeviceInfo>list = system.getCaptureDeviceInfoList(); 
    String[] possibilities = new String[list.size()]; 
    int i=0; 
    for (CaptureDeviceInfo info : list){ 
     possibilities[i] = info.getDescription(); 
     cams.put(info.getDescription(), info.getDeviceID()); 
     i++; 
    } 
    String s = (String) JOptionPane.showInputDialog(
      this, 
      "Please, choose needed web camera:\n", 
      "Select one...", 
      JOptionPane.PLAIN_MESSAGE, 
      null, 
      possibilities, null); 
    captureStream = system.openCaptureDeviceStream(cams.get(s)); 
    captureStream.setObserver(new MyCaptureObserver()); 
    setSize(captureStream.getVideoFormat().getWidth(), captureStream.getVideoFormat().getHeight()); 
    startCapture(); 
} 



public void initCapture() throws CaptureException 
{ 
    system = factory.createCaptureSystem(); 
    system.init(); 
} 

public void startCapture() throws CaptureException 
{ 
    captureStream.start(); 
} 

public void disposeCapture() throws CaptureException 
{ 
    disposing = true; 
    if (captureStream != null) 
    { System.out.println("disposeCapture: stopping capture stream..."); 
     captureStream.stop(); 
     System.out.println("disposeCapture: stopped capture stream."); 
     captureStream.dispose(); 
     captureStream = null; 
    } 
    if (system != null) 
     system.dispose(); 
    System.out.println("disposeCapture done."); 
} 

class MyCaptureObserver implements CaptureObserver 
{ 
    public void onError(CaptureStream sender, CaptureException e) 
    { 
     e.printStackTrace(); 
    } 

    public void onNewImage(CaptureStream sender, com.lti.civil.Image image) 
    { 
     if (disposing) 
      return; 
     try 
     { 
      setImage(AWTImageConverter.toBufferedImage(image)); 
     } 
     catch (Throwable t) 
     { t.printStackTrace(); 
     } 
    } 
} 
} 

également la taille de mon projet est seulement environ 3 Mo avec toutes les bibliothèques .dll pour Windows OS

je l'espère, cela aiderait quelqu'un.

Cordialement, Evgeniy

+0

Cela ne fonctionne pas Windows OS x64. Donc, si quelqu'un sait mieux sollution, s'il vous plaît faites le moi savoir. – evgeniy44

Questions connexes