在Java中显示网络摄像头

5
我上周刚开始学习Java,所以目前只是在掌握基础知识,因为我有很多东西要学习(顺便说一下,我在Ubuntu 11.04上使用Eclipse)。然而,我经常录屏,并在我做的许多视频中显示我的网络摄像头。因此,以后我想制作一个简单的应用程序,只显示网络摄像头。不需要其他任何东西。
所以我现在问这个问题,不仅是为了记住我的目标,而且当我感到准备好并有信心去处理这个问题时,我会知道该去哪里。
我不需要任何代码,但需要参考资料。我想只使用Java。虽然我的一位同事告诉我要看看FMJ和JMF。然而,不知道这些是什么,我认为它们就像Java的附加组件,但如果可能的话,我想坚持只使用Java。

另外,我还是Java的新手,正在从thenewboston的YouTube教程中学习(目前在http://www.youtube.com/watch?v=XqTg2buXS5o),所以如果你知道其他帮助像我这样的新手Java程序员和其他人的资源,将不胜感激。

6个回答

6
我使用了lti-civil,它似乎非常适合视频捕获。我已在Windows和Linux上使用过,但尚未在Mac上进行测试,但据说也可以在那里运行。
它不需要预先安装,因为它是一个jar文件和一个dll/so文件,可以通过Java应用程序下载或通过支持本地库的JNLP webstart运行。
没有100%纯Java库可以捕获视频,因此所有选项(包括JMF)都需要本地组件(.dll或.so)。

+1,这个答案非常准确。你需要在某个地方使用本地代码来完成这个任务,而且我认为最好避免使用JMF(它已经过时了)和FMJ(包括我在内的所有人都无法使其正常工作)。不幸的是,在纯Java层面上,Java中的视频支持仍然非常缺乏。一段时间以前有关于一个叫做JMC(Java媒体组件)的东西可以解决这个问题,但现在却变得很安静。希望未来会有所改善;在此之前,完全可以使用本地库来支持所有常见平台。 - Michael Berry

4
您可以使用准备好的WebcamPanel Swing组件来自Webcam Capture API项目 (我是该项目的作者)。该项目具有可移植性,适用于Windows、Linux、Mac OS的32位和64位架构,以及ARM设备例如Raspberry Pi(armel和armhf皆可)。
下面是示例代码,将显示摄像头内的图像在JFrame窗口中(帧速率是可配置的):
JPanel panel = new WebcamPanel(Webcam.getDefault());
JFrame window = new JFrame("Test webcam capture");
window.add(panel);
window.pack();
window.setVisible(true);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

测试摄像头截图

JAR包可以在Maven Central中找到,但如果您没有使用Maven,您也可以下载一个单独的ZIP文件,其中包含所有必需的依赖项(所有必要的第三方JAR包)。


3

据我所知,JMF不再得到支持,至少不再得到Oracle/Sun的支持。所有的例子似乎都是针对Java 1.1的,引用的网页已经近8年了 :) 在我看来,使用JMF最大的缺点是最终用户需要在他们的系统上安装它,然后才能运行使用它的Java应用程序。最后,我无法让JMF在Linux上运行,这意味着它真的不是跨平台的。 - Jim Morris
谢谢提供的信息。我个人会继续使用C++和Python,但我仍然想学习Java。因此,这些信息非常有帮助,谢谢。 - Michael Schwartz
@Jim Morris:是的,我提到了JMF,因为问题中提到了它。 - woliveirajr

3

以下是使用Marvin Framework实现的内容。该框架提供了一组插件,用于实时视频处理。

package video.simpleVideoTest;
import javax.swing.JFrame;
import marvin.gui.MarvinImagePanel;
import marvin.image.MarvinImage;
import marvin.video.MarvinJavaCVAdapter;
import marvin.video.MarvinVideoInterface;

public class SimpleVideoTest extends JFrame implements Runnable{

    private MarvinVideoInterface    videoAdapter;
    private MarvinImage             image;
    private MarvinImagePanel        videoPanel;

    public SimpleVideoTest(){
        super("Simple Video Test");

        // Create the VideoAdapter and connect to the camera
        videoAdapter = new MarvinJavaCVAdapter();
        videoAdapter.connect(1);

        // Create VideoPanel
        videoPanel = new MarvinImagePanel();
        add(videoPanel);

        // Start the thread for requesting the video frames 
        new Thread(this).start();

        setSize(800,600);
        setVisible(true);
    }

    public static void main(String[] args) {
        SimpleVideoTest t = new SimpleVideoTest();
        t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void run() {
        while(true){
            // Request a video frame and set into the VideoPanel
            image = videoAdapter.getFrame();
            videoPanel.setImage(image);
        }
    }
}

0

这里下载JMF。

然后,您可以从这里开始学习JMF框架。


-2

你可以使用Java Swings来实现这个功能。

你可以在这个博客geekscab.com上找到相关文章。抱歉我不知道确切的URL,所以你需要搜索一下这个博客。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接