今天研究了一下java下调用摄像头的应用,google了一上午,终于一些细节在下午搞定,特此写下来。首先,说一下环境
我的环境是:
Window 7 64 bit System
I5 2410 Intel
Java环境
JDK 1.6_19
JMF 2.1.1e
下载地址就在官网上,JDK的就不说了,JMF的:
http://download.oracle.com/otn-pub/java/jmf/2.1.1e/jmf-2_1_1e-windows-i586.exe?AuthParam=1334803872_4d611ba8e3b99f7cec20e7bf3e7eefe4
其实在Xp下,JMF工作是完好的,但是在win7下,由于win7的权限设计问题,没有Administrator权限的用户,根本无法获得设备的使用权,所以导致我白白浪费了一上午时间纠结在这个问题上,只要注意到这个问题,就一切OK。
还有,就算你是64位的系统,也要安装JDK32位,因为JMF是个比较古老的东东,不能兼容在64位上。
安装时,双击JMF*.exe,选择安装目录,会自动安装完成的。强烈建议:以管理员身份运行。当安装将要完成的时候,JMF会检测系统的可用媒体硬件,例如摄像头,麦克风等,所以会需要等待一会,耐心等待。
当然,下边会介绍个更好的方法
在桌面上,右击我的电脑--->管理---->
取消掉账户已禁用,这样,重启机器,就可以以administrator身份登录系统,这样就和普通的xp权限环境差别不大了。
一切都安装好,配置好了以后,在环境变量之中配置上
JMFHOME=E:\jmf2.1.1e
CLASSPATH=%JMFHOME%\lib;
我的环境是:
Window 7 64 bit System
I5 2410 Intel
Java环境
JDK 1.6_19
JMF 2.1.1e
下载地址就在官网上,JDK的就不说了,JMF的:
http://download.oracle.com/otn-pub/java/jmf/2.1.1e/jmf-2_1_1e-windows-i586.exe?AuthParam=1334803872_4d611ba8e3b99f7cec20e7bf3e7eefe4
其实在Xp下,JMF工作是完好的,但是在win7下,由于win7的权限设计问题,没有Administrator权限的用户,根本无法获得设备的使用权,所以导致我白白浪费了一上午时间纠结在这个问题上,只要注意到这个问题,就一切OK。
还有,就算你是64位的系统,也要安装JDK32位,因为JMF是个比较古老的东东,不能兼容在64位上。
安装时,双击JMF*.exe,选择安装目录,会自动安装完成的。强烈建议:以管理员身份运行。当安装将要完成的时候,JMF会检测系统的可用媒体硬件,例如摄像头,麦克风等,所以会需要等待一会,耐心等待。
当然,下边会介绍个更好的方法
在桌面上,右击我的电脑--->管理---->
取消掉账户已禁用,这样,重启机器,就可以以administrator身份登录系统,这样就和普通的xp权限环境差别不大了。
一切都安装好,配置好了以后,在环境变量之中配置上
JMFHOME=E:\jmf2.1.1e
CLASSPATH=%JMFHOME%\lib;
然后启动Eclipse,新建项目,将%JMFHOME%\lib下的jar全部加入到项目的classpath之中。然后测试代码如下:
import javax.media.*;
import java.io.*;
import java.awt.*;
public class CaptureVideo extends Frame implements ControllerListener {
private CaptureDeviceInfo infor;
private MediaLocator mediaLocator;
private String str1 = "vfw:Logitech USB Video Camera:0";
private String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
private String url = "vfw:Microsoft WDM Image Capture (Win32):0";
private Component com;
private Panel panel;
Player player;
public CaptureVideo() {
infor = CaptureDeviceManager.getDevice(str1);
mediaLocator = infor.getLocator();
}
public void play() {
try {
player = Manager.createPlayer(mediaLocator);// 利用mediaLocator创建Player
player.addControllerListener(this);
player.realize();
// System.out.println("infor:"+infor);
// System.out.println("mediaLocator:"+mediaLocator);
} catch (NoPlayerException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void createComponent() {
setTitle("视频信号");
// addWindowListener(new WinClose());
setBounds(100, 100, 200, 200);
panel = new Panel();
if ((com = player.getVisualComponent()) != null) {
panel.add(com);
}
add(panel);
setVisible(true);
}
public synchronized void controllerUpdate(ControllerEvent arg0) {
// TODO 自动生成方法存根
if (arg0 instanceof RealizeCompleteEvent) {
System.out.println("realized");
createComponent(); // 将播放器添加到Panel上
player.prefetch();
}
if (arg0 instanceof PrefetchCompleteEvent) {
player.start();
System.out.println("prefetched");
}
}
public static void main(String[] arg0) {
//System.out.println(CaptureDeviceManager.getDeviceList(null).size());
CaptureVideo video = new CaptureVideo();
video.play();
}
}