最近公司需要做一个人脸识别系统,需要用java读取摄像头获取视频,网上查了很多资料,需要使用jmf(opencv和ffmpeg也是可以的,不过调用比较麻烦),自己试了下安装jmf,总是出现各种问题。下面总结下我的安装过程。
- 官网下载jmf的安装包,jmf已经停止维护了,只有32位的安装程序,所以要求我们必须用32位的jdk,这点一定要记住,否则是行不通的。官网地址:下载地址点此
- 双击安装程序(以管理员身份运行,不然可能会因为权限不够找不到摄像头,好多人双击之后没反应或者提示覆盖文件没有任何反应,这个问题看了好久也没找到问题所在,我在32位win7不行,在64位win7就可以安装,jdk都是32位),进行安装,一直下一步,这一步比较简单,没啥好说的。默认安装在系统盘的32位程序目录里。
- 接下来就是重点了,首先一定要先配置环境变量,配置如下:
classpath=
C:\Program Files(x86)\JMF2.1.1e\lib\jmf.jar;C:\Program Files (x86)\JMF2.1.1e\lib\sound.jar;
path=C:\Program Files (x86)\JMF2.1.1e\bin
//根据自己的路径去修改
4.注册音视频设备,这一步很关键,不然java程序中是找不到设备的
先点击restore重置一下,然后点击Detect Capture Devices,稍等一会就会弹出扫描到的设备,确认就ok了。
注册成功之后,就会在列表中出现vfw这个选项。
5.接下来就可以java代码测试了。(要把安装目录的lib下的jar包添加到项目的build path中)
附上网上找的一段代码,亲测可用
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();
}
}
}
KingBoy原创