Java Media Framework(JMF)
JMF 是Java的一個library ,並不包含在Java SE 中 ,需要另外下載安裝。
JMF 的出現使得JAVA可以實現 audio(音訊), video (視訊)
以及其他 time-based media 相關應用。
安裝JMF
1.JMF下載網址(你必須要先裝JAVA SE)
http://www.oracle.com/technetwork/java/javase/download-142937.html
如果是windwos,十分建議安裝Windwos Perfomace Pack,也可以選擇下載Cross-paltform Java 跨平台版本。
雖然上面沒有寫Mac OS專用的,但你依然可以Cross-paltform Java .
在windows上如果無論如何都無法取得webcam裝置,可以試試看下圖中的方式, 按下去後視訊的燈有可能會閃爍一分鐘左右. 或是使用系統管理員身份執行C:\Program Files (x86)\JMF2.1.1e\bin\jmfinit.exe .
接下來是一個重點,記住下圖黃色標註Name=後面的地方,名字可能會不同,本例為
vfw: Microsoft WDM Image Capture (Win32):0
程式碼如下:
import java.awt.Component; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.media.Buffer; import javax.media.CannotRealizeException; import javax.media.CaptureDeviceInfo; import javax.media.CaptureDeviceManager; 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.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JOptionPane; public class Demo { private JFrame JF; private static Player webcamplayer = null; private CaptureDeviceInfo webcamDI = null; private MediaLocator ml = null; private Component visual; private JButton take; public Buffer buf = null; public BufferToImage bufferimage = null; /** * 預設建構子 */ public Demo() { initSwing(); initWebcam(); startWebCam(); JF.setVisible(true); } /** * * * Initial the Swing */ private void initSwing() { //get Screen size int w = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(); int h = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight(); //Initial and Setting JFrame JF = new JFrame("WebCamDemo"); JF.setLayout(null); JF.setBounds(0, 0, w, h); JF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); take = new JButton("Take a picture"); take.setBounds(10, 10, 300, 100); JF.add(take); take.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JComponent c = (JComponent) e.getSource(); if (c == take) { // Grab a frame FrameGrabbingControl fgc = (FrameGrabbingControl) webcamplayer .getControl("javax.media.control.FrameGrabbingControl"); buf = fgc.grabFrame(); // Convert it to an image bufferimage = new BufferToImage((VideoFormat) buf.getFormat()); Image img = bufferimage.createImage(buf); try { ImageIO.write((RenderedImage) img, "JPG", new File("take.jpg")); JOptionPane.showMessageDialog(null, "已拍照"); } catch (IOException ex) { } } } }); } /** * /Initial webcam Device */ private void initWebcam() { //Webcam Driver name String webcamdriver = "vfw:Microsoft WDM Image Capture (Win32):0"; //get webcam Device Info webcamDI = CaptureDeviceManager.getDevice(webcamdriver); //Locator the Media data ml = webcamDI.getLocator(); webcamDI = CaptureDeviceManager.getDevice(webcamdriver); //Initial webcamplayer try { webcamplayer = Manager.createRealizedPlayer(ml); //get a visual component visual = webcamplayer.getVisualComponent(); JF.add(visual); visual.setBounds(10, 100, 640, 480); visual.setVisible(false); } catch (NoPlayerException | CannotRealizeException | IOException e) { } } /** * Start WebCam */ private void startWebCam() { //start to get webcam data webcamplayer.start(); //visual display now visual.setVisible(true); } /** * Main Function * * @param args */ public static void main(String args[]) { Demo hw1 = new Demo(); } }程式碼中有一行
String webcamdriver = "vfw:Microsoft WDM Image Capture (Win32):0";
就是要開啟WebCamb的名稱。
最後執行結果如下:
按下拍照後
看一下照片
其實還有可以用取得裝置列表的方式來取得WebCam,本篇僅用一個最簡單的方式來呈現。
感謝看倌們不嫌棄。
沒有留言:
張貼留言