本身就java技术来说,要实现摄像头二次开发,采集摄像头图片,需要使用到JMF,JMF适合使用在j2se程序当中,我需要在web程序中调用摄像头,很明显JMF是搞不定了,想过写一个applet程序,只是那东西要求客户端必须要有jre环境,这个对于我来说不太合适,你总不能指望用户访问你的网站时先下载一个很大的jre去安装以后再来再次访问吧?
既然JMF不适用,那么我们在java项目中如何实现控制摄像头抓拍呢?本身在windows平台中我们可以使用视频采集卡等的二次开发包去实现视频数据的访问,但是现在的摄像头都是usb的,甚至是笔记本电脑的显示屏上就带有摄像头,这种情况下使用采集卡二次开发包的方案又不适用,只能自己写程序去做一个类似于“摄像头照相软件”的东西,经过一系列的分析,最后终于实现了在web程序中调用摄像头,可以通过js代码控制拍照,通过ajax技术实现数据的上传,虽然我没有在asp.net程序中测试,但是应该支持.net技术,也可以实现在asp.net的项目中采集摄像头数据,例如用来通过摄像头拍照,拍些大头贴等。
罗嗦了一大堆,程序放在了csdn的下载资源上头了,以后要做摄像头的二次开发时也不用到处找了,直接下载使用即可。
摄像头程序下载地址 http://peihexian.iteye.com/blog/1045576
压缩包中含有基于纯网页的摄像头照片采集示例程序,含有基于jquery框架的ajax数据操作程序示例,具体的怎么调用摄像头看示例代码吧,相信稍微懂些技术的人应该都能看懂,有完整的基于java技术的照片采集示例程序,使用的是jsp页面采集照片,serlvet程序接收摄像头照片数据。
以下为程序的示例运行效果:
功能:实现摄像头调用
步骤:1、到sun下载JMF,并且安装,安装后需重启电脑。下载链接http://www.oracle.com/technetwork/java/javase/download-142937.html
2、创建设置JMF的环境变量,"计算机"->"系统属性"->"高级环境设置"->"高级"->"环境变量"
变量名:"JMFHOME" 变量值:"C:\ProgramFiles\JMF2.1.1e"
变量名:"CLASSPATH" 变量值:";%JMFHOME%\lib\jmf.jar;%JMFHOME%\lib\sound.jar"
如图:
3、打开安装好了的JMF,在C:\Program Files\JMF2.1.1e\bin目录下打开“jmfregistry.exe”,选择“Capture Devices” 然后按左下角“Detect Capture Devices”按钮,多按几次,直到左边栏中出现“ vfw:Microsoft WDM Image Capture(Win32):0” ,则说明JMF已经注册了摄像头,到此就可以关闭了。
如图:
4、现在可以用Eclipse 编程了。创建一个工程,把下面样例代码复制进去,在该工程点击右键选择Build Path ->Configure Build Path...->Libraries ->Add External JARs... 然后把安装的JMF里面\lib目录下的几个Jar包导入进来。
如图:
5、运行即可。
[java] view plaincopy
1. import java.awt.BorderLayout;
2. import java.awt.Component;
3. import javax.media.CaptureDeviceInfo;
4. import javax.media.Manager;
5. import javax.media.MediaLocator;
6. import javax.media.Player;
7. import javax.media.cdm.CaptureDeviceManager;
8. import javax.swing.JFrame;
9. import javax.swing.JPanel;
10.public class Test extends JFrame{
11. public static Player player = null;
12. private CaptureDeviceInfo deviceInfo = null;
13. private MediaLocator mediaLocator = null;
14. private Component component = null;
15. private JPanel vedioPanel = null;
16.
17. String str1 = "vfw:Logitech USB Video Camera:0"; //获取USB摄像头的字符串
18. String str2 = "vfw:Microsoft WDM Image Capture (Win32):0"; //获取本地摄像头的字符串
19. // Creates a new instance of CameraTest
20. public Test() {
21. init();
22. }
23. public void init(){
24. deviceInfo = CaptureDeviceManager.getDevice(str2); //根据字符串获取采集设备(摄像头)的引用
25. // System.out.println(deviceInfo); //显示采集设备(摄像头)的信息
26. // System.out.println(deviceInfo.getName()); //显示采集设备(摄像头)的设备名称
27. mediaLocator = deviceInfo.getLocator(); //获取采集设备的定位器的引用,需要根据此引用来创建视频播放器
28.
29. try{
30. player = Manager.createRealizedPlayer(mediaLocator);// 利用mediaLocator 获取一个player
31. component = player.getVisualComponent();
32. if (component != null){
33. vedioPanel = new JPanel();
34. vedioPanel.add(component, BorderLayout.NORTH);
35. this.add(vedioPanel);
36. this.pack(); // 自动分配窗体大小
37. this.setResizable(false);
38. this.setDefaultCloseOperation(EXIT_ON_CLOSE);
39. this.setVisible(true);
40. player.start();
41. }
42. }catch(Exception e){
43. e.printStackTrace();
44. }
45. }
46.
47. public static void main(String[] args) {
48. new Test();
49. }
50.}