//本文转自天马行空百度空间http://hi.baidu.com/maxiao19880601/item/0ec41586ed583eceef083df4
//注释比较好,学习学习吧
/**
* 第一种方法:直接利用设备驱动字符串进行相应设备的加载
*/
import java.awt.BorderLayout;
import java.awt.Component;
import javax.media.CaptureDeviceInfo;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.cdm.CaptureDeviceManager;
import javax.swing.JFrame;
public class CameraTest extends JFrame{
public static Player player = null;
private CaptureDeviceInfo di = null;
private MediaLocator ml = null;
/** Creates a new instance of CameraTest */
public CameraTest() {
init();
this.setSize(400,400);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setVisible(true);
}
public void init(){
String str1 = "vfw:Logitech USB Video Camera:0"; //获取USB摄像头的字符串
String str2 = "vfw:Microsoft WDM Image Capture (Win32):0"; //获取本地摄像头的字符串
di = CaptureDeviceManager.getDevice(str2); //根据字符串获取采集设备(摄像头)的引用
System.out.println(di); //显示采集设备(摄像头)的信息
System.out.println(di.getName()); //显示采集设备(摄像头)的设备名称
ml = di.getLocator(); //获取采集设备的定位器的引用,需要根据此引用来创建视频播放器
try {
player = Manager.createRealizedPlayer(ml);
player.start();
Component comp;
if ((comp = player.getVisualComponent()) != null) {
//如果摄像头视频组件不如空,加到窗体中
this.getContentPane().add(comp, BorderLayout.NORTH);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new CameraTest();
}
}
第二种方法:(源自书籍《微博是这样炼成的-从聊天室到Twitter的技术实现》)
import java.awt.*;
import java.util.*;
import javax.media.Format;
import javax.media.Manager;
import javax.media.Player;
import javax.media.format.VideoFormat;
import javax.swing.*;
import java.awt.event.*;
/**
* 第二种方法是先获取所有的采集设备列表,然后从中挑选出满足条件的摄像头设备
*/
public class CameraTest1 extends JFrame{
/**多媒体采集对象列表*/
Vector<javax.media.CaptureDeviceInfo> deviceList=javax.media.CaptureDeviceManager.getDeviceList(null);
javax.media.MediaLocator mediaLocator=null;
Player player=null;
/** Creates a new instance of CameraTest1 */
public CameraTest1() {
this.setTitle("测试本地摄像头");
this.initCamera();
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setSize(500,500);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void initCamera(){
//查找所需要的多媒体采集程序,以vfw开头即可
javax.media.format.VideoFormat currentFormat = null;
for(int i=0;i<deviceList.size();i++){
System.out.println("获取的设备名为:"+this.deviceList.get(i).getName());
if(deviceList.get(i).getName().startsWith("vfw")){
Format [] vedioFormat=deviceList.get(i).getFormats();
for(int j=0;j<vedioFormat.length;i++){
if(vedioFormat[i] instanceof javax.media.format.VideoFormat){
currentFormat=(VideoFormat) vedioFormat[i];
break;
}
}
//判断如果得到当前的视频格式为空,则显示错误信息,否则获取其定位器
if(currentFormat==null){
System.out.println("发生错误!");
}
this.mediaLocator=deviceList.get(i).getLocator();
System.out.println("获取的采集媒体定位器为:"+this.mediaLocator);
this.createPlayerByMediaLocator();
break;
}
}
}
public void createPlayerByMediaLocator(){
try {
System.out.println(this.mediaLocator);
player = Manager.createRealizedPlayer(this.mediaLocator);
player.start();
Component comp;
if ((comp = player.getVisualComponent()) != null) {
this.getContentPane().add(comp, "Center");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new CameraTest1();
}
}
由于开启硬件加速情况下,用QQ截图程序无法获取效果图,故就不将程序运行效果图贴上了
JMF使用需要注意的问题:用netbeans或eclipse设置库文件路径时,要保证jar文件和其对应的配置文件在一起(而不要单独地将jar文件复制到你自定义的文件夹中,需将lib文件夹下所有文件都复制到你自定的文件夹中),上面两种方式才能正常地起作用,否则会找不到相应的摄像头采集设置,抛出空异常。还有就是要启用本机的硬件加速,否则也会出现错误。