JMF(Java Media Framework) でキャプチャしてみる

JMFとやらで遊んでみました。
キャプチャはすぐに取れるようになりました。


package jmftest;

import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.media.Buffer;
import javax.media.CannotRealizeException;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.JFrame;

/**
 *
 * @author
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            // TODO code application logic here
            JFrame frame = new JFrame("ImageView");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            final Player player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));
            
            frame.setBounds(100, 100, 640, 480);
            frame.getContentPane().add(player.getVisualComponent());
            frame.setVisible(true);
            player.start();

            new Thread(new Runnable() {
                public void run() {
                    while (true) {
                        captureData(player);
                        try {
                            Thread.sleep(15000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }).start();

        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoPlayerException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (CannotRealizeException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void captureData(Player player) {
        try {
            File f = new File("test_" + System.currentTimeMillis() + ".jpeg");

            Buffer buf = ((FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl")).grabFrame();
            ImageIO.write(buffer2image(buf), "jpeg", f);

            System.out.println("save file!! >> " + f.getAbsolutePath());
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static BufferedImage buffer2image(Buffer buf) {
        VideoFormat format = (VideoFormat) buf.getFormat();
        BufferToImage btoi = new BufferToImage(format);
        Dimension size = format.getSize();
        Image img = btoi.createImage(buf);
        BufferedImage bimage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = bimage.createGraphics();
        g2d.drawImage(img, 0, 0, null);
        return bimage;
    }
}

が、このライブラリって放置されているっぽい
APIが最後に修正されたのは1999年なんだって。

 http://ja.wikipedia.org/wiki/Java_Media_Framework


別なライブラリのほうがよさそうかな。。。