Webcam lib, video for java, api java jna pour avicap.dll, msvfw.dll, vfw.h

Soyez le premier à donner votre avis sur cette source.

Vue 25 115 fois - Téléchargée 1 769 fois

Description

"Certaines webcams (Philips SPC520NC...) ne fonctionnent pas avec JMF", dont la mienne, d'après ce constat j'ai réalisé une librairie utilisant du code natif via JNA basée sur avicap.dll et vfw.h.

Cette librairie fonctionnant exclusivement sous win32 permet d'accéder et de communiquer avec le driver d'une ou plusieurs webcam.
Aussi pas moyen à l'heure actuelle de l'intégrer avec AWT ou Swing, seulement avec la SWT.
Le développement continue...

Je me suis basé sur la description de Video For Window dont la doc est disponible ici : http://msdn2.microsoft.com/en-us/library/ms712699%28VS.85%29.aspx

La classe org.hypik.webcamlib.DeviceManager permet de lister tous les drivers installés en renvoyant des instances de org.hypik.webcamlib.device.Device.
Cette dernière propose une API permettant de:
- Créer la fenêtre de la webcam avec les différents styles possibles,
- Se connecter à la webcam,
- Demander à la webcam de copier la frame courante dans le presse-papier,
- Se déconnecter,
- De s'aboner aux erreurs renvoyées par la webcam,
- De s'abonner aux messages de status,
- De s'abonner à chaque frame affichées,
- De récupérer une frame,
- Détruire la fenêtre,
- D'ouvrir les boites de dialogues de configuration proposées par le driver,
- De dispatcher les messages du système vers la fenêtre de la webcam si on utilise pas la SWT ( marche pas avec AWT/Swing)

Le package org.hypik.webcam.compressor permet de décompresser une frame dans un certain format vers un autre. L'api permet de:
-Lister tous les décompresseurs disponible,
-Recherche un décompresseur pour un format d'entrée vers un format de sortie,
-Bien sur de décompresser une frame,

Je vous propose trois classes de tests (Simple, SWT et AWT) pour bien prendre en main la librairie.
Elles peuvent être lancées directement en renommant les fichiers contenu dans bin en .bat.
Pour le test utilisant la swt il vous faut la librairie disponible sur http://www.eclipse.org/swt/

Ci-dessous le code du simple test.

J'espère pouvoir faire évoluer cette librairie rapidement.
Vos retours/suggestions sont les bienvenus.
NB: Toutes mes excuses au pingouin mais j'ai pas le courage de me pencher sur video4linux.
Pierrick Hymbert

Source / Exemple :


/**

  • Webcam Library, version 1.2
  • The easiest way to manage webcam devices in java.
  • (c) 2008 Pierrick HYMBERT <pierrick.hymbert@gmail.com>
  • This library is "PROVIDED AS IS" without guaranty of any kinds.
  • Webcam Library is freely distribuable under the terms of an MIT-style license.
  • Visit www.hypik.fr
  • /
package org.hypik.webcamlib.test.sample; import java.util.List; import org.hypik.webcamlib.DeviceManager; import org.hypik.webcamlib.device.Device; import org.hypik.webcamlib.device.IWS; import org.hypik.webcamlib.device.listener.DeviceErrorListener; import org.hypik.webcamlib.device.listener.DeviceStatusListener; import com.sun.jna.Native; /**
  • This class have only a main method to start all webcam devices found in a webcam preview window.
  • @author Pierrick Hymbert <a href="mailto:pierrick.hymbert@gmail.com">Contact</a>
*
  • /
public class SimpleTest { /**
  • Start all webcam devices found in a webcam preview window
  • @param args N/A
  • /
public static void main(String[] args){ // Prevent VM crash Native.setProtected(true); // List all devices List<Device> devices = DeviceManager.getAllDevices(); try { // Print all device driver name and version for (Device device : devices) { System.out.println("Found: " + device); } } catch (Exception e) { e.printStackTrace(); } // Check if at least one device is found if( devices.size() == 0 ){ System.err.println("No device found."); System.exit(0); } // Start all webcam preview int x = 0, y = 0; for (Device device : devices) { // Add the listeners device.addDeviceErrorListener(errorListener); device.addDeviceStatusListener(statusListener); // Show preview device.showPreview(x, y, 300, 300, IWS.WS_OVERLAPPEDWINDOW | IWS.WS_VISIBLE, device.getName(), 0, 0); x += 320; if( x > 800 ){ x = 0; y += 320; } } // Run all devices loop int deviceDisposed = 0; while( deviceDisposed < devices.size()){ deviceDisposed = 0; for (Device device : devices) { if( !device.isDisposed() ){ device.readAndDispatch(); }else{ deviceDisposed++; } } } System.exit(0); } /**
  • The device error listener.
  • /
private static DeviceErrorListener errorListener = new DeviceErrorListener(){ /**
  • Fire the listener that the device throws an error message.
  • @param device
  • The device in error state.
  • @param errorId
  • The error id is one of the constants below.
  • @param errorMessage
  • The error message.
  • /
public void deviceError(Device device, int errorId, String errorMessage) { System.err.println(device + "->" + errorId + ": " + errorMessage); } }; /**
  • The device error listener.
  • /
private static DeviceStatusListener statusListener = new DeviceStatusListener(){ /**
  • Fire the listener that the device fire a status message.
  • @param device
  • The device in error state.
  • @param statusId
  • The status id is one of the constants below.
  • @param statusMessage
  • The status message.
  • /
public void deviceStatus(Device device, int statusId, String statusMessage){ System.out.println(device + "->" + statusId + ": " + statusMessage); } }; }

Conclusion :


A oui... Il vous faut au moins une webcam!!!

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

the_wwt
Messages postés
177
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
16 janvier 2009
1 -
Petite correction:
les fichiers à renommer pour lancer les tests sont à la racine du zip et non pas dans le répertoire bin ( qui lui contient les *.class)
A+
Pierrick
throws
Messages postés
4
Date d'inscription
mardi 28 mars 2006
Statut
Membre
Dernière intervention
25 mai 2008
-
Je viens de tester ta lib avec les fichiers SAMPLE_TEST , niquel la webcam de mon portable un fujitsu amilo est toute suite reconnu et me retourne l'image ..
Bon travail ....
Amenophis77
Messages postés
4
Date d'inscription
samedi 15 décembre 2007
Statut
Membre
Dernière intervention
23 avril 2009
-
Très bon programme lol, Je voudrai savoir comment faire pour prendre des photos en mode photo et non en mode vidéo. Car je voudrai utiliser la resolution maximal de ma webcam donc 1280x1024 par Philips ToUcam Pro- PCVC740k---> Pour la photo d'astronomie).
Et aussi, Utiliser la Webcam SPC1300NC Philipps en HD (en test -> Plus grande résolution 3200x2048 en 24bits Usb2. Merci d'avance pour ton aide.
yep666
Messages postés
3
Date d'inscription
dimanche 2 janvier 2005
Statut
Membre
Dernière intervention
6 mai 2009
-
J'ai pas de webcam sous la main donc je n'ai pas pu tester mais j'ai relevé une petite erreur dans la classe
org.hypik.webcamlib.test.sample.Test
IDevice.WS_SHELL_TRIM cannot be resolved
Sinon les autres classes de test compilent.
En tous cas ton travail m'intéresse beaucoup :)
yep666
Messages postés
3
Date d'inscription
dimanche 2 janvier 2005
Statut
Membre
Dernière intervention
6 mai 2009
-
J'ai eu l'occasion de tester sur un portable et ça marche impec. Je vais pouvoir reprendre un vieux projet mis dans un carton, merci :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.