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
別なライブラリのほうがよさそうかな。。。