TheRom_S | puisque je vois que ça passionne tout le monde (et surtout qu'il y a pas beaucoup de ressources sur ce sujet sur le net), voilà la solution : attaquer directement le flux
Par contre, c'est parfaitement fluide mais il y a un gros décalage (environ 1 sec), ce qui n'est pas très bon vu que c'est sensé être utilisé en temps réel.
Des idées ?
Code :
- public class DeviceHandler {
- private boolean ready;
- private CaptureDeviceInfo device;
- private PushBufferDataSource dataSource;
-
- /** Creates a new instance of DeviceHandler */
- public DeviceHandler(String deviceName) throws Exception {
- this.ready = false;
- this.device = null;
- this.device = CaptureDeviceManager.getDevice(deviceName);
- if (this.device == null) { throw new Exception("Device : \"" + deviceName + "\" not found !" ); }
- MediaLocator ml = this.device.getLocator();
- if (ml == null) { throw new Exception("Unable to find an appropriate media locator !" ); }
- this.dataSource = null;
- DataSource ds = null;
- try { ds = Manager.createDataSource(ml); }
- catch (NoDataSourceException ex) { throw new Exception("Unable to find an appropriate data source !", ex); }
- catch (IOException ex) { throw new Exception("Unable to create an appropriate data source !", ex); }
- if (ds == null) { throw new Exception("Data source is NULL !" ); }
- //System.out.println(ds.getClass());
- // pour ma webcam, c'est PushBufferDataSource
- if (!(ds instanceof PushBufferDataSource)) { throw new Exception("Wrong type of data source !" ); }
- this.dataSource = (PushBufferDataSource)ds;
- try { this.dataSource.connect(); }
- catch (IOException ex) {}
- try { this.dataSource.start(); }
- catch (IOException ex) { throw new Exception("Unable to start data transfert !", ex); }
- this.ready = true;
- }
-
- public boolean isReady() { return this.ready; }
-
- public Object getBuffer() {
- Buffer buf = new Buffer();
- try { this.dataSource.getStreams()[0].read(buf); }
- catch (IOException ex) {
- ex.printStackTrace();
- }
- return buf.getData();
- }
- }
- // le main
- public static void main(String[] args) {
- DeviceHandler dh = null;
- try { dh = new DeviceHandler("vfw:Microsoft WDM Image Capture (Win32):0" ); }
- catch (Exception ex) {
- ex.printStackTrace();
- System.exit(0);
- }
- while (!dh.isReady()) {}
- BufferedImage img = new BufferedImage(320, 240, BufferedImage.TYPE_INT_RGB);
- int tre = 15;
- while (true) {
- Object o = dh.getBuffer();
- if ((o != null) && (o instanceof byte[])) {
- byte[] b = (byte[])o;
- int[] ib = new int[76800];
- for (int i = 0; i < b.length / 3; i++) {
- // on parcours le buffer à l'envers (BGRBGRBGR... du bas droit vers haut gauche)
- ib [76800 - i - 1] = (b[3 * i + 2] << 16) + (b[3 * i + 1] << 8) + b[3 * i];
- }
- img.setRGB(0, 0, 320, 240, ib, 0, 320);
- // traitements sur l'image
- }
- }
-
- }
|
---------------
The Rom's, à votre service
|