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,本篇僅用一個最簡單的方式來呈現。
感謝看倌們不嫌棄。




沒有留言:
張貼留言