利用JMF获取本地摄像头的两种方法

//本文转自天马行空百度空间http://hi.baidu.com/maxiao19880601/item/0ec41586ed583eceef083df4


//注释比较好,学习学习吧


/**

* 第一种方法:直接利用设备驱动字符串进行相应设备的加载

*/

import java.awt.BorderLayout;
import java.awt.Component;
import javax.media.CaptureDeviceInfo;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.cdm.CaptureDeviceManager;
import javax.swing.JFrame;
public class CameraTest extends JFrame{
    public   static   Player   player   =   null;
    private   CaptureDeviceInfo   di   =   null;
    private   MediaLocator   ml   =   null;
    /** Creates a new instance of CameraTest */
    public CameraTest() {
        init();
        this.setSize(400,400);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setVisible(true);
    }
    public void init(){
        String   str1   =   "vfw:Logitech   USB   Video   Camera:0";      //获取USB摄像头的字符串
        String   str2   =   "vfw:Microsoft WDM Image Capture (Win32):0";    //获取本地摄像头的字符串
        di   =   CaptureDeviceManager.getDevice(str2);     //根据字符串获取采集设备(摄像头)的引用
        System.out.println(di);         //显示采集设备(摄像头)的信息
        System.out.println(di.getName());     //显示采集设备(摄像头)的设备名称
        ml   =   di.getLocator();      //获取采集设备的定位器的引用,需要根据此引用来创建视频播放器
        try {
            player   =   Manager.createRealizedPlayer(ml);
            player.start();
            Component   comp;
            if   ((comp   =   player.getVisualComponent())   !=   null) {
                //如果摄像头视频组件不如空,加到窗体中
                this.getContentPane().add(comp,   BorderLayout.NORTH);
            }
        } catch   (Exception   e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new CameraTest();
    }
}
第二种方法:(源自书籍《微博是这样炼成的-从聊天室到Twitter的技术实现》)

import java.awt.*;
import java.util.*;
import javax.media.Format;
import javax.media.Manager;
import javax.media.Player;
import javax.media.format.VideoFormat;
import javax.swing.*;
import java.awt.event.*;
/**
 * 第二种方法是先获取所有的采集设备列表,然后从中挑选出满足条件的摄像头设备
 */
public class CameraTest1 extends JFrame{
    /**多媒体采集对象列表*/
    Vector<javax.media.CaptureDeviceInfo>  deviceList=javax.media.CaptureDeviceManager.getDeviceList(null);
    javax.media.MediaLocator mediaLocator=null;
    Player player=null;
    /** Creates a new instance of CameraTest1 */
    public CameraTest1() {
        this.setTitle("测试本地摄像头");
        this.initCamera();
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setSize(500,500);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
    
    public void initCamera(){
        //查找所需要的多媒体采集程序,以vfw开头即可
        javax.media.format.VideoFormat currentFormat = null;
        for(int i=0;i<deviceList.size();i++){
            System.out.println("获取的设备名为:"+this.deviceList.get(i).getName());
            if(deviceList.get(i).getName().startsWith("vfw")){
                Format [] vedioFormat=deviceList.get(i).getFormats();
                for(int j=0;j<vedioFormat.length;i++){
                    if(vedioFormat[i] instanceof javax.media.format.VideoFormat){
                        currentFormat=(VideoFormat) vedioFormat[i];
                        break;
                    }
                }
                //判断如果得到当前的视频格式为空,则显示错误信息,否则获取其定位器
                if(currentFormat==null){
                    System.out.println("发生错误!");
                }
                this.mediaLocator=deviceList.get(i).getLocator();
                System.out.println("获取的采集媒体定位器为:"+this.mediaLocator);
                this.createPlayerByMediaLocator();
                break;
            }
        }
    }
    
    public void createPlayerByMediaLocator(){
        try {
            System.out.println(this.mediaLocator);
            player   =   Manager.createRealizedPlayer(this.mediaLocator);
            player.start();
            Component   comp;
            if   ((comp   =   player.getVisualComponent())   !=   null) {
                this.getContentPane().add(comp, "Center");
            }
        } catch   (Exception   e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        new CameraTest1();
    }
}
 

由于开启硬件加速情况下,用QQ截图程序无法获取效果图,故就不将程序运行效果图贴上了

 

JMF使用需要注意的问题:用netbeans或eclipse设置库文件路径时,要保证jar文件和其对应的配置文件在一起(而不要单独地将jar文件复制到你自定义的文件夹中,需将lib文件夹下所有文件都复制到你自定的文件夹中),上面两种方式才能正常地起作用,否则会找不到相应的摄像头采集设置,抛出空异常。还有就是要启用本机的硬件加速,否则也会出现错误。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值