JMF(Java Media Framework)是Java媒体框架,包含了许多用于处理多媒体的API可以让基于JAVA的应用实现音频、视频的捕捉、处理、播放、传输等功能。利用它,可以实现音、视频播放,网络视频聊天、视频会议等功能。不说了,开讲:

自从sun被oracle 收购后,网址都改成oracle.com了,网上的 sun.com的网址都不对;我下载的版本是:jmf-2_1_1e-windows-i586

2、安装:按提示一步步安装下去就可以了,安装后要重启;安装完毕后,在你的JDK安装目录\jre\lib\ext下,会多出两个文件:jmf.jar和sound.jar

3、测试摄像头:安装完毕后,在桌面会多一个"JMStudio"的快捷方式,运行它,点击"File->Capture"菜单,如果启动摄像头成功,说明你安装jmf成功。如果失败的话,按网上的说法,必须是安装32位的JDK才可以,因为JMF只支持32位JDK。由于我本机没有安装64位JDK,所以这点没有验证。

4、编写JAVA代码打开电脑摄像头,以下代码也是从网上修改而来,但是必须做以下修改才运行正常:

a、必须先初始化摄像头、再设置Jframe的一些属性并显示,如果先后顺序颠倒的话,则窗体上不会正确显示摄像头。(我本机64位win7 +jdk1.6 );

b、在eclipse中选择jdk的时候,最好选择安装jmf时所识别的jdk,否则可能报错。网上的解决方式:将jmf安装目录\lib目录下的jmf.jar,sound.jar,mediaplayer.jar三个文件导入工程,目的是要引入该目录下的jmf.properties

ok,上代码,我本机测试通过的:

import java.awt.BorderLayout; 
 import java.awt.Component; 
 import java.util.Vector;import javax.media.CaptureDeviceInfo; 
 import javax.media.CaptureDeviceManager; 
 import javax.media.Manager; 
 import javax.media.MediaLocator; 
 import javax.media.Player; 
 import javax.swing.JFrame;public class CameraTest extends JFrame { 

 public CameraTest() throws Exception { 
 //先启动摄像头,再做后续的初始化窗体,可保证正确显示摄像头 
 initCapture(); 

 //设置窗体的一些属性 
 this.setTitle("CaptureTest"); 
 this.setBounds(500, 100, 800, 500); 
 this.setVisible(true); 
 this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
 }/** 
 * 初始化摄像头 
 */ 
 private void initCapture() throws Exception { 
 //获取所有音频、视频设备 
 Vector<javax.media.CaptureDeviceInfo> deviceList = javax.media.CaptureDeviceManager.getDeviceList(null);

 //获取视频设备,视频设备以vfw打头 
 CaptureDeviceInfo cameraDevice = null; 
 for(CaptureDeviceInfo cameraDeviceTmp :deviceList){ 
 if (cameraDeviceTmp.getName().startsWith("vfw")) { 
 cameraDevice = cameraDeviceTmp; 
 break; 
 } 
 } 

 if(cameraDevice == null){ 
 throw new Exception("找不到摄像头设备"); 
 }//创建视频播放器 
 MediaLocator ml = cameraDevice.getLocator(); 
 Player player = Manager.createRealizedPlayer(ml);if (player == null){ 
 throw new Exception("创建摄像头播放器失败"); 
 } 

 //播放视频 
 player.start(); 


 //将播放器加入窗体 
 Component comp = null; 
 if ((comp = player.getVisualComponent()) != null) 
 add(comp, BorderLayout.CENTER); 

 }public static void main(String[] args) { 
 try {CameraTest mc = new CameraTest(); 
 } catch (Exception e) { 
 e.printStackTrace(); 
 } 
 } 
 }