我有一个USB的摄象头,我想用JAVA实现显示摄象头的数据,听说JMF可以实现,请问如何实现,谢谢,希望能给出相关代码

解决方案 »

  1.   

    //package com.redtroy;import javax.media.Player;
    import javax.media.CaptureDeviceInfo;
    import javax.media.MediaLocator;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.image.*;
    import java.awt.event.*;
    import javax.media.control.FrameGrabbingControl;
    import javax.media.Buffer;
    import javax.media.util.BufferToImage;
    import javax.media.format.VideoFormat;
    import java.io.*;
    import com.sun.image.codec.jpeg.*;
    import javax.media.CaptureDeviceManager;
    import javax.media.Manager;
    import java.net.*;
    import java.applet.*;//import javax.swing.im
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2005</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class Camera
        extends JFrame {
      private static Player player = null;
      private CaptureDeviceInfo device = null;
      private MediaLocator locator = null;
      private Buffer buffer = null;
      private BufferToImage b2i = null;
      private Image image;
      private ImageIcon iicon = new ImageIcon();
      boolean proportion = true;
      String str1 = "vfw:Logitech USB Video Camera:0";
      String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
      JButton jButton1 = new JButton();
      JButton jButton2 = new JButton();
      Component component1;
      JLabel jLabel1 = new JLabel();
      public Camera() {
        super("troy的摄像机(无保存功能)");
        try {
          jbInit();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }  public Image resize(int width, int height, Image source, boolean flag) {
        this.proportion = flag;
        int new_w;
        int new_h;
        Toolkit tk = Toolkit.getDefaultToolkit();
        Applet app = new Applet();
        MediaTracker mt = new MediaTracker(app);
        Image img = source;
        try {
          mt.addImage(img, 0);
          mt.waitForID(0);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        if (img.getWidth(null) == -1) {
          System.out.println(" can't read,retry!" + "<BR>");
          return null;
        }
        else {      if (this.proportion == true) { //判断是否是等比缩放.
    //为等比缩放计算输出的图片宽度及高度
            double rate1 = ( (double) img.getWidth(null)) / (double) width +
                0.1;
            double rate2 = ( (double) img.getHeight(null)) / (double) height +
                0.1;
            double rate = rate1 > rate2 ? rate1 : rate2;
            new_w = (int) ( ( (double) img.getWidth(null)) / rate);
            new_h = (int) ( ( (double) img.getHeight(null)) / rate);
          }
          else {
            new_w = width; //输出的图片宽度
            new_h = height; //输出的图片高度
          }
        }
        BufferedImage buffImg = new BufferedImage(new_w, new_h,
                                                  BufferedImage.TYPE_INT_RGB);    Graphics g = buffImg.createGraphics();    g.setColor(Color.white);
        g.fillRect(0, 0, new_w, new_h);    g.drawImage(img, 0, 0, new_w, new_h, null);    g.dispose();
        try {
          OutputStream tempout = new
              FileOutputStream("C:\\temp.jpg");
          JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
          encoder.encode(buffImg);
          tempout.close();    }
        catch (Exception e) {
          e.printStackTrace();
        }
        return tk.createImage("C:\\temp.jpg");
      }  public static void main(String[] args) {
        Camera camera1 = new Camera();
      }  private void jbInit() throws Exception {    component1 = Box.createGlue();
        //=====================初始化设备===================//
        component1.addNotify();
        device = CaptureDeviceManager.getDevice(str2);
        locator = device.getLocator();
        try {
          player = Manager.createRealizedPlayer(locator);
          player.start();      if ( (component1 = player.getVisualComponent()) != null) {
            this.getContentPane().add(component1, null);
          }
        }
        catch (Exception e) {
          e.printStackTrace();
        }    jButton1.setBounds(new Rectangle(294, 28, 73, 25));
        jButton1.setText("拍照");
        jButton1.addActionListener(new Camera_jButton1_actionAdapter(this));
        this.getContentPane().setLayout(null);
        jButton2.setBounds(new Rectangle(295, 82, 73, 25));
        jButton2.setText("保存");
        jButton2.addActionListener(new Camera_jButton2_actionAdapter(this));
        component1.setBounds(new Rectangle(27, 23, 243, 235));
        jLabel1.setIconTextGap(4);
        jLabel1.setText("空");
        jLabel1.setVerticalTextPosition(SwingConstants.CENTER);    jLabel1.setBounds(new Rectangle(293, 139, 80, 95));    this.getContentPane().add(jButton1, null);
        this.getContentPane().add(jButton2, null);
        this.getContentPane().add(jLabel1, null);
        this.setSize(400, 300);
        this.setVisible(true);
      }  void jButton1_actionPerformed(ActionEvent e) {
        iicon = new ImageIcon();
        FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl(
            "javax.media.control.FrameGrabbingControl");
        buffer = fgc.grabFrame(); // 获取当前祯并存入Buffer类
        b2i = new BufferToImage( (VideoFormat) buffer.getFormat());
        image = b2i.createImage(buffer); // show the image
        iicon = new ImageIcon();
        /* Toolkit tk = Toolkit.getDefaultToolkit();
         Applet app = new Applet();
         MediaTracker mt = new MediaTracker(app);*/
        iicon.setImage(this.resize(85, 95, image, true));
        jLabel1.setIcon(iicon);  }  void jButton2_actionPerformed(ActionEvent e) {    JFileChooser filechooser = new JFileChooser();
        filechooser.setFileHidingEnabled(true);    filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int result = filechooser.showSaveDialog(null);
        if (result == JFileChooser.CANCEL_OPTION) {
          return;
        }
        File file = filechooser.getSelectedFile();
        if (file == null || file.getName().equals("")) {
          JOptionPane.showMessageDialog(null, "无效的文件名", "警告",
                                        JOptionPane.ERROR_MESSAGE);
        }
        else {      String s = file.getAbsolutePath();      BufferedImage bi = (BufferedImage) createImage(image.getWidth(null),
              image.getHeight(null));
          Graphics2D g2 = bi.createGraphics();
          g2.drawImage(image, null, null);
          FileOutputStream out = null;
          try {
            out = new FileOutputStream(s);
          }
          catch (java.io.FileNotFoundException io) {
            System.out.println("File Not Found");
          }      JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
          JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
          param.setQuality(1f, false); //不压缩图像
          encoder.setJPEGEncodeParam(param);
          try {
            encoder.encode(bi);
            out.close();
          }
          catch (java.io.IOException io) {
            System.out.println("IOException");
          }
        }  }}class Camera_jButton1_actionAdapter
        implements java.awt.event.ActionListener {
      Camera adaptee;  Camera_jButton1_actionAdapter(Camera adaptee) {
        this.adaptee = adaptee;
      }  public void actionPerformed(ActionEvent e) {
        adaptee.jButton1_actionPerformed(e);
      }
    }class Camera_jButton2_actionAdapter
        implements java.awt.event.ActionListener {
      Camera adaptee;  Camera_jButton2_actionAdapter(Camera adaptee) {
        this.adaptee = adaptee;
      }  public void actionPerformed(ActionEvent e) {
        adaptee.jButton2_actionPerformed(e);
      }
    }
      

  2.   

    String str1 = "vfw:Logitech USB Video Camera:0";
        String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
    str1和str2是摄像头的型号吧,我的是Logitech USB Video Camera,可是在初始化设备时
    device = CaptureDeviceManager.getDevice(str2);
    locator = device.getLocator();//这一句报空指针,不知道为什么呢??
      

  3.   

    对不起,错了
    device = CaptureDeviceManager.getDevice(str2);应该是
    device = CaptureDeviceManager.getDevice(str1);
    请高手指点,应该是设备得不到
      

  4.   

    jmf不怎么样,我奉劝一句
      

  5.   

    javax.media包去哪儿下啊?我这报错说找不到media下的几个包!谢谢!