Использовать веб-камеру в качестве камеры эмулятора Android - PullRequest
2 голосов
/ 23 февраля 2012

Я хочу использовать веб-камеру в качестве камеры в эмуляторе Android .

Я упомянул это , но получил следующую ошибку при запуске WebcamBroadcaster: Невозможно найти подходящего игрока

Как упомянуто в этой ссылке, я создал WebcamBroadcaster как отдельное Java-приложение, и к моей машине подключена рабочая веб-камера.

Когда я запускаю камеру эмулятора напрямую (не в любом приложении), он работает. Но я пытаюсь использовать камеру в своем приложении, используя WebcamBroadcaster, но это не работает. Скорее это дает анимацию стиля шахматной доски.

Я новичок в разработке для Android, поэтому любая помощь приветствуется!

WebcamBroadcaster.java

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) {
            DataSource source;
            Format[] formats = info.getFormats();
            for (Format format : formats) {
                if ((format instanceof RGBFormat)) {
                    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();
                    source = Manager.createDataSource(locator);
                    source.connect();
                    System.out.println("RGB Format Found");
                    ((CaptureDevice) source).getFormatControls()[0]
                            .setFormat(rgb);
                } else if ((format instanceof YUVFormat)) {
                    YUVFormat yuv = (YUVFormat) format;
                    Dimension size = yuv.getSize();
                    if (size.width != width || size.height != height)
                        continue;
                    MediaLocator locator = info.getLocator();
                    source = Manager.createDataSource(locator);
                    source.connect();
                    System.out.println("YUV Format Found");
                    ((CaptureDevice) source).getFormatControls()[0]
                            .setFormat(yuv);
                } else {
                    continue;
                }

                return Manager.createRealizedPlayer(source);
            }
        }
    } catch (IOException e) {
        System.out.println(e.toString());
        e.printStackTrace();
    } catch (NoPlayerException e) {
        System.out.println(e.toString());
        e.printStackTrace();
    } catch (CannotRealizeException e) {
        System.out.println(e.toString());
        e.printStackTrace();
    } catch (NoDataSourceException e) {
        System.out.println(e.toString());
        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]);
    }
    //length of args and values is **0**
    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) {
    //**THIS IS THE MAIN PROBLEM**
            System.err.println("Unable to find a suitable player");
            return;
        }
        System.out.println("Starting the player");
        player.start();
        control = (FrameGrabbingControl) player
                .getControl("javax.media.control.FrameGrabbingControl");
        worker = new Worker();
        worker.start();
        System.out.println("Grabbing frames");
        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 */
        }
    }

}

}

1 Ответ

1 голос
/ 09 марта 2012

используйте «JMyron» вместо «JMF», поскольку jmf устарела.

...