简单讲解用JMF技术在网页中用Applet直接抓取摄像头的影像的问题???

chch328 2008-07-04 06:48:03
(原创)简单讲解用JMF技术在网页中用Applet直接抓取摄像头的影像(附源代码)
Oscar Xie
Software Engineer
eMail:Xie.Oscar@gmail.com
MSN:oscar.xie@eBaoTech.com

需求描述:

我自己的R&D系统学生注册模块中,学生领到ID号码后,在电脑前用摄像头采集照片,采集的工作人员在WEB页面上控制系统采集拍照,工作人员可以实时看到学生头像的效果,在等到满意的画面时按拍照取像,系统将原来页面上指定的区域内照片采集下来,同时生成ID号码的条形码图像存入数据库(暂不讨论,过后发新帖)。

之前在这里发过类似的贴子,在这个需求中,需要实现用Applet在页面直接拍照,当然拍照的同时要实时预览拍摄的取像效果,所以有一个监视窗口,同时在监视窗口中画一个红色的矩形拍照边框,拍照结束后,直接将照片插入图像数据库,最早我想用SWT做GUI然后内部用JMF技术来拍照,将数据流用SWT容器来显示(就是监视窗口),这个如果用AWT的窗口是不费吹灰之力的,但是界面不好看,用SWT是一个技术难点,主要是数据流和播放容器的问题,所以值得一试,但是这里的问题一直没有解决,期待有人能提供一个解决方案。现在我是用Applet在页面上直接拍照的,可以看到WebCam的实时影像,其它的就是如何将Applet取到的单桢图像保存下来,这个问题不大,不过这里可能会遇到的问题就是安全问题,JMF有一个注册表专门来管理这些JMF相关的配置信息。

这里我没有摄像头,用了一个虚拟摄像头软件,驱动都一样的。

代码解析如下(论坛页面上对中括号的处理有bug,我将中括号临时改了一下):

import java.awt.BorderLayout;
import java.awt.Choice;
import java.awt.Component;
import java.util.Vector;
// JMF相关的类
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Format;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.format.VideoFormat;

import javax.swing.JPanel;
import javax.swing.JApplet;

public class VApplet extends JApplet {

private JPanel jContentPane = null;

private Choice choice = null;

public VApplet() {
super();
}

public void init() {
this.setSize(320, 240);
this.setContentPane(getJContentPane());
this.setName("VApplet");
}
 // 取系统所有可采集的硬件设备列表
private CaptureDeviceInfo[] getDevices() {
Vector devices = CaptureDeviceManager.getDeviceList(null);
CaptureDeviceInfo[] info = new CaptureDeviceInfo[devices.size()];
for (int i = 0; i < devices.size(); i++) {
info〔i〕 = (CaptureDeviceInfo) devices.get(i);
}
return info;
}
// 从已知设备中取所有视频设备的列表
private CaptureDeviceInfo[] getVideoDevices() {
CaptureDeviceInfo[] info = getDevices();
CaptureDeviceInfo[] videoDevInfo;
Vector vc = new Vector();
for (int i = 0; i < info.length; i++) {
// 取设备支持的格式,如果有一个是视频格式,则认为此设备为视频设备
Format[] fmt = info〔i〕.getFormats();
for (int j = 0; j < fmt.length; j++) {
if (fmt[j] instanceof VideoFormat) {
vc.add(info〔i〕);
}
break;
}
}
videoDevInfo = new CaptureDeviceInfo[vc.size()];
for (int i = 0; i < vc.size(); i++) {
videoDevInfo〔i〕 = (CaptureDeviceInfo) vc.get(i);
}
return videoDevInfo;
}

private JPanel getJContentPane() {
if (jContentPane == null) {
BorderLayout borderLayout = new BorderLayout();
jContentPane = new JPanel();
jContentPane.setLayout(borderLayout);

MediaLocator ml = null;
Player player = null;
try {
// 这里我只有一个视频设备,直接取第一个
      // 取得当前设备的MediaLocator
ml = getVideoDevices()[0].getLocator();
// 用已经取得的MediaLocator得到一个Player
player = Manager.createRealizedPlayer(ml);
player.start();
// 取得Player的AWT Component
Component comp = player.getVisualComponent();
// 如果是音频设备这个方法将返回null,这里要再判断一次
if (comp != null) {
// 将Component加到窗体
jContentPane.add(comp, BorderLayout.EAST);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return jContentPane;
}
}

为什么我在运行时会发生如下错误:
JJava Plug-in 1.6.0_04
使用 JRE 版本 1.6.0_04 Java HotSpot(TM) Client VM
用户主目录 = C:\Documents and Settings\chenhong


----------------------------------------------------
c: 清除控制台窗口
f: 终结在结束队列上的对象
g: 垃圾收集
h: 显示此帮助消息
l: 转储类载入程序列表
m: 打印内存使用
o: 触发日志记录
p: 重新载入代理配置
q: 隐藏控制台
r: 重新载入策略配置
s: 转储系统和部署属性
t: 转储线程列表
v: 转储线程堆栈
x: 清除类载入程序高速缓存
0-5: 设置跟踪级别为 <n>
----------------------------------------------------

java.lang.NoClassDefFoundError: [Ljavax/media/CaptureDeviceInfo;
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getDeclaredMethod(Unknown Source)
at java.awt.Component.isCoalesceEventsOverriden(Unknown Source)
at java.awt.Component.access$100(Unknown Source)
at java.awt.Component$2.run(Unknown Source)
at java.awt.Component$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Component.checkCoalescing(Unknown Source)
at java.awt.Component. <init>(Unknown Source)
at java.awt.Container. <init>(Unknown Source)
at java.awt.Panel. <init>(Unknown Source)
at java.awt.Panel. <init>(Unknown Source)
at java.applet.Applet. <init>(Unknown Source)
at javax.swing.JApplet. <init>(Unknown Source)
at Camera. <init>(Camera.java:24)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at sun.applet.AppletPanel.createApplet(Unknown Source)
at sun.plugin.AppletViewer.createApplet(Unknown Source)
at sun.applet.AppletPanel.runLoader(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.media.CaptureDeviceInfo
at sun.applet.AppletClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
... 27 more
Caused by: java.io.FileNotFoundException: E:\chenhong\workspace\Jspro\WebRoot\javax\media\CaptureDeviceInfo.class (系统找不到指定的路径。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream. <init>(Unknown Source)
at java.io.FileInputStream. <init>(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
at sun.applet.AppletClassLoader.getBytes(Unknown Source)
at sun.applet.AppletClassLoader.access$100(Unknown Source)
at sun.applet.AppletClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
... 32 more
...全文
310 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ziyouzai 2008-07-06
Caused by: java.io.FileNotFoundException: E:\chenhong\workspace\Jspro\WebRoot\javax\media\CaptureDeviceInfo.class (系统找不到指定的路径。)
回复
chch328 2008-07-06
这个是不是找不到那个类阿 这各类 应该是JMF.jar包里面的
这个怎么办啊
回复
相关推荐
发帖
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2008-07-04 06:48
社区公告
暂无公告