首页 文章

java上的便携式应用程序使用网络摄像头

提问于
浏览
2

如果我可以就我的问题得到建议,那将是很好的:我正在使用一个应该向用户显示连接的PC摄像头列表的应用程序 . 例如,使用我的笔记本电脑,我有一个内置的网络摄像头和一个USB摄像头 . 在运行应用程序时,用户应该能够选择所需的设备并使用它创建照片 .

我已经使用了这个问题好几天了,并使用以下现有框架进行了研究:JMF,FMJ,VLCJ,Xuggler,JMyron,JavaFX,JavaCV .

其中一些已被弃用;其他人需要为每台客户端PC安装SDK . 我的应用程序的主要要求是可移植性,这使我佩戴使用外部SDK .

是否可以仅使用Java完成此任务?

现在我的应用程序应该只适用于Windows操作系统 .

那么,我可以就如何解决我的问题提出一些建议吗?

此致,Evgeniy

1 回答

  • 0

    对不起,我这么早就发布了这个问题 . 我刚刚解决了这个问题 . 我用过LTI-CIVIL . 它还没有更新5年......无论如何,它适用于我的所有网络摄影师 . 我更改了一些用法示例,以在现有设备之间切换 . 这是我的代码:

    public class CaptureFrame extends ImageFrame
    {
    private Map <String, String>cams = new HashMap<String, String>();
    public static void main(String[] args) throws CaptureException
    {
        new CaptureFrame(DefaultCaptureSystemFactorySingleton.instance()).run();
    }
    
    private CaptureSystem system;
    private CaptureStream captureStream;
    private final CaptureSystemFactory factory;
    private volatile boolean disposing = false;
    
    public CaptureFrame(CaptureSystemFactory factory)
    {   
        super("LTI-CIVIL");
        this.factory = factory;
    }
    
    public void run() throws CaptureException
    {
        initCapture();
    
        setLocation(200, 200);
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                try
                {
                    disposeCapture();
                } catch (CaptureException e1)
                {
                    e1.printStackTrace();
                }
                System.exit(0);
            }
        });
        setVisible(true);
        pack();
    
        system = factory.createCaptureSystem();
        system.init();
        List <CaptureDeviceInfo>list = system.getCaptureDeviceInfoList();
        String[] possibilities = new String[list.size()];
        int i=0;
        for (CaptureDeviceInfo info : list){
            possibilities[i] = info.getDescription();
            cams.put(info.getDescription(), info.getDeviceID());
            i++;
        }
        String s = (String) JOptionPane.showInputDialog(
                this,
                "Please, choose needed web camera:\n",
                "Select one...",
                JOptionPane.PLAIN_MESSAGE,
                null,
                possibilities, null);
        captureStream = system.openCaptureDeviceStream(cams.get(s));
        captureStream.setObserver(new MyCaptureObserver());
        setSize(captureStream.getVideoFormat().getWidth(), captureStream.getVideoFormat().getHeight());
        startCapture();
    }
    
    
    
    public void initCapture() throws CaptureException
    {
        system = factory.createCaptureSystem();
        system.init();
    }
    
    public void startCapture() throws CaptureException
    {
        captureStream.start();
    }
    
    public void disposeCapture() throws CaptureException
    {
        disposing = true;
        if (captureStream != null)
        {   System.out.println("disposeCapture: stopping capture stream...");
            captureStream.stop();
            System.out.println("disposeCapture: stopped capture stream.");
            captureStream.dispose();
            captureStream = null;
        }
        if (system != null)
            system.dispose();
        System.out.println("disposeCapture done.");
    }
    
    class MyCaptureObserver implements CaptureObserver
    {
        public void onError(CaptureStream sender, CaptureException e)
        {   
            e.printStackTrace();
        }
    
        public void onNewImage(CaptureStream sender, com.lti.civil.Image image)
        {   
            if (disposing)
                return;
            try
            {
                setImage(AWTImageConverter.toBufferedImage(image));
            }
            catch (Throwable t)
            {   t.printStackTrace();
            }
        }
    }
    }
    

    对于Windows操作系统,所有.dll库的项目大小也只有3 MB左右

    我希望它会对某人有所帮助 .

    此致,Evgeniy

相关问题