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

Java技术 专栏收录该内容
62 篇文章 0 订阅
描述:Eclipse中直接运行的效果
图片:
描述:Firefox浏览器中运行的效果
图片:
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;
}
}

这个例子需要的环境信息如下:

Java Media Framework 运行库下载地址

http://java.sun.com/products/java-media/jmf/2.1.1/download.html

Additional link
http://java.sun.com/products/java-media/jmf/2.1.1/documentation.html
 
引自:http://www.eclipseworld.org/bbs/read-cec-tid-11180-fpage-2.html
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值