在Java中访问网络摄像头的最佳方法

62

我需要使用Java访问网络摄像头。这就是我想做的事情:

  1. 访问网络摄像头

  2. 现在用户可以看到网络摄像头工作,因为他的脸可以在屏幕上看到(听说有一些库不能显示网络摄像头的视频输出)

  3. 当用户点击保存按钮时,拍摄照片并保存

我已经尝试了多种方法很长一段时间:

  1. JMF - 现在已经死亡
  2. FMJ - 现在也已经死亡
  3. VLCJ - 太麻烦了,因为我不是在创建音乐/视频播放器,并且它需要安装VLC
  4. Xuggler - 太麻烦,太难了
  5. JMyron - 没有起作用
  6. JavaFX - 我以为它可以做到,但似乎不能

即使该库只执行上述操作,我也会满意,因为这对我来说足够了。但是我希望它也要简单易用。如果它不使用DLL文件会很好,因为如果使用DLL文件,它就不是跨平台的。真的很感激如果它可以自动检测摄像头,而不需要像在VLCJ中手动传递摄像头名称和其他信息(因为可能有成千上万个摄像头品牌,我无法创建包含数千个元素的列表)。并且,我正在创建一个桌面应用程序,而不是Web应用程序。

如果您知道类似的库,请友好地让我知道。其他库(可能不适合我所有的要求,但适合基本需求)也欢迎。请帮帮我。


可能会有成千上万的摄像头?真的吗?你是为安保公司写这篇文章吗?另外,数千个元素的列表并不糟糕 - 你总可以在UI上进行筛选或以某种方式进行搜索。 - corsiKa
4
@corsiKa: 不,我的意思是,如果我要把它交给其他人使用,我不能每次都修改程序以提供他们的相机名称。你知道,应该有一种方式,使其适用于所有(或至少列出)相机品牌。在VLC中,我们不需要传递相机名称,它会自动识别。这就是我的意思。 - PeakGen
1个回答

84

我认为你正在寻找的项目是:https://github.com/sarxos/webcam-capture(我是作者)

有一个例子完全符合您的描述-运行后,出现窗口,在您按“开始”按钮后,您可以看到来自网络摄像头设备的实时图像,并在单击“快照”后将其保存到文件中(源代码可用,请注意角落里的FPS计数器可以禁用):

snapshot

该项目具有可移植性(WinXP、Win7、Win8、Linux、Mac、Raspberry Pi),不需要在PC上安装任何其他软件。

API非常好且易于学习。以下是如何捕获单个图像并将其保存为PNG文件的示例:

Webcam webcam = Webcam.getDefault();
webcam.open();
ImageIO.write(webcam.getImage(), "PNG", new File("test.png"));

@Pacerier,您可以使用IP摄像机驱动程序从远程网络摄像头获取数据(如果摄像机支持JPEG或MJPEG,则源代码中提供演示),或通过WebcamStreamer公开本地摄像机的图像(非常有限但能用的Web服务器,可提供MJPEG流)。 源代码中还有一个示例演示如何使用xuggler将图像帧作为h.264流进行流式传输(仅为概念验证)。 - Bartosz Firyn
@BartoszFiryn,视频和图像的大小相差很大。此外,像网络摄像头这样的实时视频需要保持实时性。静态图像可以承受1或2秒的延迟,用户不会太在意。对于网络摄像头,您如何处理延迟和带宽? - Pacerier
1
@Pacerier,我不处理延迟和带宽,因为这个库不是用于通过互联网进行流媒体传输的。请查看项目页面和/或随时打开新的工单,如果您有任何其他问题,这样我们就不会在stackoverflow上发布不必要的评论了。 - Bartosz Firyn
1
这个库似乎真的可以工作(在Linux上测试过)。已经移植到JavaX 这里 - Stefan Reich
哇,这个库太棒了。非常感谢!到目前为止,这是我使用过最简单的库。示例可以直接运行,我只需要添加Maven依赖和代码示例即可。注意:如果你将webcam.getImage()放在一个循环中,你就可以不断地捕获当前的图像。 :) - Kenny Cason
显示剩余5条评论

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