(原创)简单讲解用JMF技术在网页中用Applet直接抓取摄像头的影像(附源代码) 
Oscar Xie 
Software Engineer 
eMail:[email protected] 
MSN:[email protected] 需求描述: 我自己的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 

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【chch328】截止到2008-07-04 18:48:09的历史汇总数据(不包括此帖):
    发帖的总数量:2                        发帖的总分数:40                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:2                        未结的总分数:40                       
    结贴的百分比:0.00  %               结分的百分比:0.00  %                  
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    Caused by: java.io.FileNotFoundException: E:\chenhong\workspace\Jspro\WebRoot\javax\media\CaptureDeviceInfo.class (系统找不到指定的路径。) 
      

  3.   

    这个是不是找不到那个类阿 这各类 应该是JMF.jar包里面的
    这个怎么办啊