2010年7月1日

首先安装jmf,安装过程中会提示注册摄像头.

开始代码

用applet比较快

package com.cayden.video;

import java.awt.BorderLayout;
import java.awt.Choice;
import java.awt.Component;
import java.util.Vector;

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.JApplet;
import javax.swing.JPanel;

public class VApplet extends JApplet {

	private JPanel jContentPane = null; 
	 
	private Choice choice = null;
	 
	public VApplet() {
		super();
	}
	 
	public void init() {
		this.setSize(640, 480); 
		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();
		
		System.out.println("设备数:"+info.length);
		
		CaptureDeviceInfo[] videoDevInfo;
		
		Vector vc = new Vector();
		
		for (int i = 0; i < info.length; i++) {
			
		// 取设备支持的格式,如果有一个是视频格式,则认为此设备为视频设备
		Format[] fmt = info[i].getFormats();
		
		System.out.println("fmt.length="+fmt.length);
		
			for (int j = 0; j < fmt.length; j++) {
				if (fmt[j] instanceof VideoFormat) {
					System.out.println("fmt[j] "+fmt[j]);
					vc.add(info[i]);
				}
				break;
			}
		}
	
		videoDevInfo = new CaptureDeviceInfo[vc.size()];
	
		for (int i = 0; i < vc.size(); i++) {
			videoDevInfo[i] = (CaptureDeviceInfo) vc.get(i);
		}
		
		System.out.println("videoDevInfo "+videoDevInfo.length);
		
		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;
	}
	}



运行效果如图所示.
视频图片


posted @ 2010-07-01 17:05 cayden 阅读(1021) 评论(0)  编辑


2010年6月18日

一 介 绍

cglib是一个开源项目!

是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。许多开源项目都用到了它,如Hibernate,Spring之类用它来实现动态代理。

二 简单样例—动态生成bean

样例说明:建立一个动态实体bean,使用cglib动态加入属性,和相应的get,set方法。

需要导入cglib-nodep-2.2.jar

 对应的jar包,在附件中.

写道 先建一个bean

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;

/**
 * 动态实体bean
 * @author cuiran
 * @version 1.0
 */
public class CglibBean {
	/**
	 * 实体Object
	 */
	public Object object = null;

	/**
	 * 属性map
	 */
	public BeanMap beanMap = null;

	public CglibBean() {
		super();
	}

	@SuppressWarnings("unchecked")
	public CglibBean(Map<String,Class> propertyMap) {
		this.object = generateBean(propertyMap);
		this.beanMap = BeanMap.create(this.object);
	}

	/**
	 * 给bean属性赋值
	 * @param property 属性名
	 * @param value 值
	 */
	public void setValue(String property, Object value) {
		beanMap.put(property, value);
	}

	/**
	 * 通过属性名得到属性值
	 * @param property 属性名
	 * @return 值
	 */
	public Object getValue(String property) {
		return beanMap.get(property);
	}

	/**
	 * 得到该实体bean对象
	 * @return
	 */
	public Object getObject() {
		return this.object;
	}

	@SuppressWarnings("unchecked")
	private Object generateBean(Map<String,Class> propertyMap) {
		BeanGenerator generator = new BeanGenerator();
		Set keySet = propertyMap.keySet();
		for (Iterator i = keySet.iterator(); i.hasNext();) {
			String key = (String) i.next();
			generator.addProperty(key, (Class) propertyMap.get(key));
		}
		return generator.create();
	}
}

 

 



测试类如下:
import java.lang.reflect.Method;
import java.util.HashMap;

/**
 * Cglib测试类
 * @author cuiran
 * @version 1.0
 */
public class CglibTest {
	
	
	
	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws ClassNotFoundException {

		// 设置类成员属性
		HashMap<String, Class> propertyMap = new HashMap<String, Class>();

		propertyMap.put("id", Class.forName("java.lang.Integer"));

		propertyMap.put("name", Class.forName("java.lang.String"));

		propertyMap.put("address", Class.forName("java.lang.String"));

		// 生成动态 Bean
		CglibBean bean = new CglibBean(propertyMap);

		// 给 Bean 设置值
		bean.setValue("id", new Integer(123));

		bean.setValue("name", "454");

		bean.setValue("address", "789");

		// 从 Bean 中获取值,当然了获得值的类型是 Object

		System.out.println("  >> id      = " + bean.getValue("id"));

		System.out.println("  >> name    = " + bean.getValue("name"));

		System.out.println("  >> address = " + bean.getValue("address"));

		// 获得bean的实体
		Object object = bean.getObject();

		// 通过反射查看所有方法名
		Class clazz = object.getClass();
		Method[] methods = clazz.getDeclaredMethods();
		for (int i = 0; i < methods.length; i++) {
			System.out.println(methods[i].getName());
		}
	}
}

 

 最后运行结果如下:

 

>> id = 123
>> name = 454
>> address = 789
setId
getAddress
getName
getId
setName
setAddress

jar包下载请到

http://cuiran.javaeye.com/admin/blogs/689582 此处下载.

posted @ 2010-06-18 14:18 cayden 阅读(366) 评论(0)  编辑


2010年6月13日

今天在做练习时候突然在想这两者间的区别,@id表示引用已经有的id,而@+id表示增加一个id.

posted @ 2010-06-13 13:52 cayden 阅读(2793) 评论(2)  编辑

     前些日子偶然发现博客园上面有些文章很不错就注册了,一个账号,今天申请开通了自己的博客,也在这里有个家了.希望自己能够在这个大家庭里面获得更多的知识,同时也把自己所学,所知奉献给大家!

posted @ 2010-06-13 10:16 cayden 阅读(6) 评论(0)  编辑


posts - 0, comments - 2, trackbacks - 0, articles - 4

Copyright © cayden