Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Работа с видео камерой через J2ME


Автор: Brodyaga 31.7.2009, 17:58
Доброго всем времени суток!
Заинтересовал такой вопрос.. Могу ли я через J2ME сделать чтото типа стандартной проги работающей с камерой.
Если точнее, то нужно чтобы на экране отображалось всё что "видит" камера и была кнопка например "Начать запись". При нажатии на эту кнопку камера начинает записывать видео и затем помещает его в память телефона(или если не держит jsr-75, то не помещает smile ).
Возможно ли такое? Если возможно, то в какую сторону смотреть?

Автор: javaitek 1.8.2009, 00:27
Работать с камерой возможно при наличии в телефоне Mobile Media API (JSR-135).
В документации к WTK есть два примера:
В обоих примерах ставь Manager.createPlayer("capture://video");

Scenario 10: Capture and Recording
Код

    try {
        // Create a DataSource that captures live audio.
        Player p = Manager.createPlayer("capture://audio");
        p.realize();
        // Get the RecordControl, set the record location, and 
        // start the Player and record for 5 seconds.
        RecordControl rc = (RecordControl)p.getControl("RecordControl");
        rc.setRecordLocation("file:/tmp/audio.wav");
        rc.startRecord();
        p.start();
        Thread.currentThread().sleep(5000);
        p.stop();
        rc.stopRecord();
        rc.commit();
    } catch (IOException ioe) {
    } catch (MediaException me) {
    } catch (InterruptedException e) { }


Scenario 11: Camera
Код

    Player p;
    VideoControl vc;

    // initialize camera 
    try {
        p = Manager.createPlayer("capture://video");
        p.realize();

        // Grab the video control and set it to the current display.
        vc = (VideoControl)p.getControl("VideoControl");
        if (vc != null) {
            Form form = new Form("video");
            form.append((Item)vc.initDisplayMode(vc.USE_GUI_PRIMITIVE, null));
            Display.getDisplay(midlet).setCurrent(form);
        }

        p.start();

        byte[] image = vc.getSnapshot(null);

        // do something with the image ...

    } catch (IOException ioe) {
    } catch (MediaException me) { }

Автор: Brodyaga 1.8.2009, 07:55
Цитата


Код

...
rc.setRecordLocation("file:/tmp/audio.wav");
...



Как я понял, это сохраняется в файловую систему телефона. А jsr-75 для этого не нужен?

Автор: javaitek 1.8.2009, 12:35
Цитата
Как я понял, это сохраняется в файловую систему телефона. А jsr-75 для этого не нужен?


jsr-75 обязательно нужен, без него нельзя записать в файловую систему. Однако, обычно, где есть камера (Mobile Media API), там есть и jsr-75.

Вот еще примерчик:

Код

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.List;
import javax.microedition.media.Manager;
import javax.microedition.media.Player;
import javax.microedition.media.control.RecordControl;
import javax.microedition.media.control.VideoControl;
import javax.microedition.midlet.MIDlet;

/**
 * @author javaitek
 *
 */
public class VideoCam extends MIDlet implements CommandListener {

    Display display;
    Form form = new Form("Video");
    Command exit = new Command("Выход", Command.EXIT, 1);
    Command start = new Command("Начать", Command.ITEM, 1);
    Command stop = new Command("Остановить", Command.ITEM, 1);

    String url;
    Player player;
    VideoControl videoControl;
    Item videoItem;
    RecordControl recordControl;
    String contentType;
    ByteArrayOutputStream outputStream;

    public VideoCam() {
        display = Display.getDisplay(this);
        form.addCommand(exit);
        form.addCommand(start);
        form.setCommandListener(this);
        List list = new List("Тип записи", List.EXCLUSIVE);
        list.append("video", null);
        list.append("audio", null);
        list.addCommand(new Command("Выбрать", Command.ITEM, 1));
        list.setCommandListener(new CommandListener() {
            public void commandAction(Command c, Displayable d) {
                List list = (List) d;
                switch (list.getSelectedIndex()) {
                case 0:
                    url = "capture://video";
                    break;
                case 1:
                    url = "capture://audio";
                    break;
                default:
                    url = "capture://video";
                break;
                }
                form.append(url + "\n");
                display.setCurrent(form);
            }
        });
        display.setCurrent(list);
    }

    public void startApp() {}

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }

    public void commandAction(Command c, Displayable d) {
        if (c == exit) {
            notifyDestroyed();
        }
        if (c == start) {
            new Thread() {
                public void run() {
                    try {
                        form.removeCommand(start);
                        form.addCommand(stop);
                        player = Manager.createPlayer(url);
                        player.realize();
                        contentType = player.getContentType();
                        form.append(contentType + "\n");
                        videoControl = (VideoControl) player.getControl("VideoControl");
                        if (videoControl != null) {
                            videoItem = (Item) videoControl.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, null);
                            form.append(videoItem);
                        } else {
                            form.append("No VideoControl" + "\n");
                        }
                        recordControl = (RecordControl) player.getControl("RecordControl");
                        if (recordControl != null) {
                            outputStream = new ByteArrayOutputStream();
                            recordControl.setRecordStream(outputStream);
                            recordControl.startRecord();
                            form.append("Recording..." + "\n");
                        } else {
                            form.append("No RecordControl" + "\n");
                        }
                        player.start();
                    } catch (Exception e) {
                        e.printStackTrace();
                        form.append(e.toString() + "\n");
                    }
                }
            }.start();
        }
        if (c == stop) {
            new Thread() {
                public void run() {
                    try {
                        form.removeCommand(stop);
                        player.stop();
                        if (recordControl != null) {
                            recordControl.stopRecord();
                            recordControl.commit();
                            form.append("Stopped" + "\n");
                        }
                        if (videoItem != null) {
                            for (int i = 0; i < form.size(); i++) {
                                Item item = form.get(i);
                                if (item == videoItem) {
                                    form.delete(i);
                                }
                            }
                        }
                        if (outputStream != null) {
                            InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
                            player = Manager.createPlayer(inputStream, contentType);
                            player.realize();
                            videoControl = (VideoControl) player.getControl("VideoControl");
                            if (videoControl != null) {
                                videoItem = (Item) videoControl.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, null);
                                form.append(videoItem);
                            }
                            player.start();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        form.append(e.toString() + "\n");
                    }
                }
            }.start();
        }
    }

}


В архиве исходник и готовая прога

Автор: Brodyaga 5.8.2009, 17:03
Спасибо за примеры! буду разбираться...

Автор: 404NotFound 29.8.2012, 12:00
А подскажите, а возможно ли как то обратиться к вспышке телефона?

Автор: tweener 11.9.2012, 16:56
Цитата(404NotFound @ 29.8.2012,  12:00)
А подскажите, а возможно ли как то обратиться к вспышке телефона?

JSR-234 (Advanced Multimedia Supplements):

javax.microedition.amms.control.camera

Interface FlashControl

Цитата
FlashControl controls the flash of the camera device.

When the flash is on (mode is not OFF), the flash is used when the snapshots are taken. Setting up the flash usually takes some time so when the flash is used and a snapshot is taken either by VideoControl or SnapshotControl, the exact time when the snapshot will be taken depends on the flash device. If the flash device will not be able to flash, for instance, because the battery of the device cannot charge the flash, taking the snapshot will result in an error.

The default mode for flash is OFF. 

Автор: 404NotFound 15.9.2012, 22:32
Спасибо! Буду пробовать!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)