Conectar java + web cam

Iniciado por mapers, 17 Mayo 2012, 06:19 AM

0 Miembros y 1 Visitante están viendo este tema.

mapers

Buenas señores estoy desarrollando en android una aplicacion que incluye manejo de camara para hacer los testeos esoty usando una clase que encontre en google en la que puedo enlazar la camara del emuladro de android con mi web cam de mi laptop pero lo malo que no me sale me tira siempre este error :

<Unable to find a suitable player>

aqui les dejo la clase que encontre a ver si me dan una manito porque sale eso

Código (java) [Seleccionar]

import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

import javax.imageio.ImageIO;
import javax.media.Buffer;
import javax.media.CannotRealizeException;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Format;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoDataSourceException;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.RGBFormat;
import javax.media.format.VideoFormat;
import javax.media.protocol.CaptureDevice;
import javax.media.protocol.DataSource;
import javax.media.util.BufferToImage;

/**
* A disposable class that uses JMF to serve a still sequence captured from a
* webcam over a socket connection. It doesn't use TCP, it just blindly captures
* a still, JPEG compresses it, and pumps it out over any incoming socket
* connection.
*
* @author Tom Gibara
*
*/

public class WebcamBroadcaster {

        public static boolean RAW = false;

        private static Player createPlayer(int width, int height) {
                try {
                        Vector<CaptureDeviceInfo> devices = CaptureDeviceManager.getDeviceList(null);
                        for (CaptureDeviceInfo info : devices) {

                                Format[] formats = info.getFormats();
                                for (Format format : formats) {
                                        if (!(format instanceof RGBFormat))
                                                continue;
                                        RGBFormat rgb = (RGBFormat) format;
                                        Dimension size = rgb.getSize();
                                        if (size.width != width || size.height != height)
                                                continue;
                                        if (rgb.getPixelStride() != 3)
                                                continue;
                                        if (rgb.getBitsPerPixel() != 24)
                                                continue;
                                        if (rgb.getLineStride() != width * 3)
                                                continue;
                                        MediaLocator locator = info.getLocator();
                                        DataSource source = Manager.createDataSource(locator);
                                        source.connect();
                                        System.out.println("Done");
                                        ((CaptureDevice) source).getFormatControls()[0]
                                                        .setFormat(rgb);
                                        return Manager.createRealizedPlayer(source);
                                }
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                } catch (NoPlayerException e) {
                        e.printStackTrace();
                } catch (CannotRealizeException e) {
                        e.printStackTrace();
                } catch (NoDataSourceException e) {
                        e.printStackTrace();
                }
                return null;
        }

        public static void main(String[] args) {
                int[] values = new int[args.length];
                for (int i = 0; i < values.length; i++) {
                        values[i] = Integer.parseInt(args[i]);
                }

               
               
                WebcamBroadcaster wb;
                if (values.length == 0) {
                        wb = new WebcamBroadcaster();
                } else if (values.length == 1) {
                        wb = new WebcamBroadcaster(values[0]);
                } else if (values.length == 2) {
                        wb = new WebcamBroadcaster(values[0], values[1]);
                } else {
                        wb = new WebcamBroadcaster(values[0], values[1], values[2]);
                }

                wb.start();
        }

        public static final int DEFAULT_PORT = 9889;
        public static final int DEFAULT_WIDTH = 320;
        public static final int DEFAULT_HEIGHT = 240;

        private final Object lock = new Object();

        private final int width;
        private final int height;
        private final int port;

        private boolean running;

        private Player player;
        private FrameGrabbingControl control;
        private boolean stopping;
        private Worker worker;

        public WebcamBroadcaster(int width, int height, int port) {
                this.width = width;
                this.height = height;
                this.port = port;
        }

        public WebcamBroadcaster(int width, int height) {
                this(width, height, DEFAULT_PORT);
        }

        public WebcamBroadcaster(int port) {
                this(DEFAULT_WIDTH, DEFAULT_HEIGHT, port);
        }

        public WebcamBroadcaster() {
                this(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_PORT);
        }

        public void start() {
                synchronized (lock) {
                        if (running)
                                return;
                        player = createPlayer(width, height);
                        if (player == null) {
                                System.err.println("Unable to find a suitable player");
                                return;
                        }
                        player.start();
                        control = (FrameGrabbingControl) player
                                        .getControl("javax.media.control.FrameGrabbingControl");
                        worker = new Worker();
                        worker.start();
                        running = true;
                }
        }

        public void stop() throws InterruptedException {
                synchronized (lock) {
                        if (!running)
                                return;
                        if (player != null) {
                                control = null;
                                player.stop();
                                player = null;
                        }
                        stopping = true;
                        running = false;
                        worker = null;
                }
                try {
                        worker.join();
                } finally {
                        stopping = false;
                }
        }

        private class Worker extends Thread {

                private final int[] data = new int[width * height];

                @Override
                public void run() {
                        ServerSocket ss;
                        try {
                                ss = new ServerSocket(port);

                        } catch (IOException e) {
                                e.printStackTrace();
                                return;
                        }

                        while (true) {
                                FrameGrabbingControl c;
                                synchronized (lock) {
                                        if (stopping)
                                                break;
                                        c = control;
                                }
                                Socket socket = null;
                                try {
                                        socket = ss.accept();

                                        Buffer buffer = c.grabFrame();
                                        BufferToImage btoi = new BufferToImage((VideoFormat) buffer
                                                        .getFormat());
                                        BufferedImage image = (BufferedImage) btoi
                                                        .createImage(buffer);

                                        if (image != null) {
                                                OutputStream out = socket.getOutputStream();
                                                if (RAW) {
                                                        image.getWritableTile(0, 0).getDataElements(0, 0,
                                                                        width, height, data);
                                                        image.releaseWritableTile(0, 0);
                                                        DataOutputStream dout = new DataOutputStream(
                                                                        new BufferedOutputStream(out));
                                                        for (int i = 0; i < data.length; i++) {
                                                                dout.writeInt(data[i]);
                                                        }
                                                        dout.close();
                                                } else {
                                                        ImageIO.write(image, "JPEG", out);
                                                }
                                        }

                                        socket.close();
                                        socket = null;
                                } catch (IOException e) {
                                        e.printStackTrace();
                                } finally {
                                        if (socket != null)
                                                try {
                                                        socket.close();
                                                } catch (IOException e) {
                                                        /* ignore */
                                                }
                                }

                        }

                        try {
                                ss.close();
                        } catch (IOException e) {
                                /* ignore */
                        }
                }

        }

}

RyogiShiki

Puedes seguir los pasos que mencionan en esta pregunta hecha en StackOverflow: http://stackoverflow.com/questions/1276450/how-to-use-web-camera-in-android-emulator-to-capture-a-live-image

--

Ahora ciertamente no sabia que se podía hacer eso. Pero he visto ese error en otras ocasiones con el uso JMF y puedo decir que es posible que tu cámara sea incompatible y noe sté siendo reconocida por el runtime, o que tal vez en este caso este mal las direcciones en SocketCamera. En todo caso este es un error bastante dificil de corregir, y requiere bastante para encontrar una solución válida. Sin mencionar la poca documentación que existe al respecto.

Por otro lado puede ser que sea algo trivial y simple y con las instrucciones se resuelva. esperemos que este sea el caso. Porque si no es así me temo que me será muy dificil ayudarte en un futuro cercano.

Saludos


mapers

#2
Si se puede tiene que salirme para publicarlo en el foro :D me dijeron que cambie este parametro YUVFormat lugar de RGBFormat,ayudame en esa parte me salen errores porfavor !!!!
Aparentemente parece que funciona porque se prende el foco de mi camara!!!
pero no se ve nada:S mi duda esta si esta bien lo que he hecho

Código (java) [Seleccionar]

private static Player createPlayer(int width, int height) {
        try {
            Vector<CaptureDeviceInfo> devices = CaptureDeviceManager.getDeviceList(null);
            for (CaptureDeviceInfo info : devices) {
               
                Format[] formats = info.getFormats();
                for (Format format : formats) {
                    if (!(format instanceof YUVFormat)) {
                        continue;
                    }
                    //RGBFormat rgb = (RGBFormat) format;
                   
                    YUVFormat YUV = (YUVFormat)format;
                    //Dimension size = rgb.getSize();
                   
                    Dimension size =YUV.getSize();
                    if (size.width != width || size.height != height) {
                        continue;
                    }
                   // if(YUV.get)
                   // if (rgb.getPixelStride() != 3) {
                    //    continue;
                   // }
                   // if (rgb.getBitsPerPixel() != 24) {
                     //   continue;
                   // }
                  //  if (rgb.getLineStride() != width * 3) {
                    //    continue;
                  //  }
                    MediaLocator locator = info.getLocator();
                    DataSource source = Manager.createDataSource(locator);
                    source.connect();
                    System.out.println("XD");
                    ((CaptureDevice) source).getFormatControls()[0].setFormat(YUV);
                    return Manager.createRealizedPlayer(source);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoPlayerException e) {
            e.printStackTrace();
        } catch (CannotRealizeException e) {
            e.printStackTrace();
        } catch (NoDataSourceException e) {
            e.printStackTrace();
        }
        return null;
    }
   


RyogiShiki

Pues no veo nada sustancialmente mal, además no es que haya trabajado mucho con SMF o WebcamBroadcaste (con esta última no he trabajado nunca), pero leyendo he encontrado un comentario en respuesta a un problema de un usuario que tenia blackscreen y lo solucionaba así:

Citar

Had same problem of black screen but got it working.

Check that:
1)
Your Preview Class has the following (original) methods

public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(w, h);
mCamera.setParameters(parameters);
mCamera.startPreview();
}

2) Your Manifest File contain CAMERA and INTERNET User permissions.

Espero sea información de ayuda.

Saludos


mapers

En sintesis parece que si funciona la modificacion que hize porque cuando le doy al navegador mi ip de mi pc y el puerto que uso (127.0.0.1:9889) se ven los fotogramas lo malo que tengo que estar actualizando ( F5) para que se vea el siguiente fotograma ;
no tienes algun software que me puedas recomendar para verlos mas fluidos.

RyogiShiki

Revisando un poco por la web, me he dado cuenta que el emulador de Android para ICS soporta directamente la utilización de camaras web para las aplicaciones que requieran la cámara del telefono. Así que podrías probar a actualizar tu ADK y crear un AVD con ICS.

También te sugiero que revises estos enlaces:
http://www.inter-fuser.com/2009/09/live-camera-preview-in-android-emulator.html
http://www.ecole.ensicaen.fr/~reynaud/android/webcam_in_android_emulator.html

Que en tal caso de que no puedas hacer las pruebas con un AVD con ICS te pueden ser de gran ayuda.

Saludos


mapers

De uno de esos enlaces lo e sacado pero no me conecta el android :S no se porque te podria pasar mi proyecto para que lo veas :S o no se puede 

RyogiShiki

Porque no usas el ADK más reciente y el emulador de ICS así te ahorras todos estos problemas.

Saludos


mapers

como asi ???? pero tengo presente que la camara del emulador de androi no funciona

RyogiShiki

Pero que emulador tienes? Hasta donde he visto el emulador de Ice Cream Sandwich soporta el uso de camaras web para aplicaciones que requieran la cámara del teléfono.

Aqui tienes la guia para instalar el último Android SDK: http://developer.android.com/sdk/installing.html

También asegurate de tener el último ADT (porque imagino que estás desde Eclipse)

Crea un nuevo dispositivo en el AVD Manager que use ICS y que tenga la camara activada por defecto. Eso debería bastar.

Saludos