java usb摄像头_Android中多USB摄像头解决方案——UVCCamera源码分析(一)

本文是关于在Android中使用UVCCamera框架实现多USB摄像头的解决方案。首先介绍了初始化和启动预览的过程,涉及的类包括USBMonitor、UsbControlBlock、UVCCameraHandler等。文章详细阐述了Java层的调用流程,如请求USB权限、建立连接、打开相机。C层主要分析了UVCCamera.cpp中的connect、getSupportedSize和setPreviewSize方法。最后,文章提到后续将探讨startPreview的相关操作,并指出该库可能存在的一些问题及改进方向。
摘要由CSDN通过智能技术生成

前言

前段时间捣鼓多USB摄像头的方案,一阵手忙脚乱算是勉强跑起来了。整个流程主要还是依赖于网上大神们封装好的库。之前想仔细分析一下整套底层实现,然而一直拖到现在……也没有完全看完,于是想着干脆分阶段总结吧。未来打算用几篇文章的篇幅来分析启动、拍照、视频录制等几个环节。

本篇就从相机的初始化、启动预览说起吧。废话少说,进入正题。

先贴链接:

整个UVCCamera框架包括了Java层封装,c层UVCCamera、c层libuvc以及c层libusb这几个库。

Java层

我们先从业务方直接可以调用的最上层(Java层)说起。

在初始化阶段,整个Java层会涉及到的类有:

com.serenegiant.usb.USBMonitor

com.serenegiant.usb.USBMonitor.UsbControlBlock

com.serenegiant.usb.USBMonitor.OnDeviceConnectListener

com.serenegiant.usb.common.UVCCameraHandler

com.serenegiant.usb.common.AbstractUVCCameraHandler.CameraThread

稍微画了一下整个调用流程,读者可以粗略看一下有个大概印象:

f7f548c2c0e7

Java层时序图

当我们启动相机的时候,第一件要做的事情就是要连接上摄像头,依然是usb摄像头,那么自然我们会需要尝试建立usb连接。而连接usb设备要做的第一件事就是获取权限:

/**

* request permission to access to USB device

* @param device

* @return true if fail to request permission

*/

public synchronized boolean requestPermission(final UsbDevice device) {

// if (DEBUG) Log.v(TAG, "requestPermission:device=" + device);

boolean result = false;

if (isRegistered()) {

if (device != null) {

if (mUsbManager.hasPermission(device)) {

// call onConnect if app already has permission

processConnect(device);

} else {

try {

// パーミッションがなければ要求する

mUsbManager.requestPermission(device, mPermissionIntent);

} catch (final Exception e) {

// Android5.1.xのGALAXY系でandroid.permission.sec.MDM_APP_MGMTという意味不明の例外生成するみたい

Log.w(TAG, e);

processCancel(device);

result = true;

}

}

} else {

processCancel(device);

result = true;

}

} else {

processCancel(device);

result = true;

}

return result;

}

从代码中可以看到,在获取到权限之后继而调用了processConnect方法来尝试建立usb连接:

/**

* open specific USB device

* @param device

*/

private final void processConnect(final UsbDevice device) {

if (destroyed) return;

updatePermission(device, true);

mAsyncHandler.post(new Runn

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Java调用摄像头进行拍照的示例代码: ```java import java.awt.Dimension; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import com.github.sarxos.webcam.Webcam; public class WebcamCaptureExample extends JPanel implements Runnable { private static final long serialVersionUID = 1L; private Webcam webcam = null; private BufferedImage image = null; public WebcamCaptureExample() { super(); setPreferredSize(new Dimension(640, 480)); webcam = Webcam.getDefault(); webcam.setViewSize(new Dimension(640, 480)); } @Override public void run() { while (true) { try { image = webcam.getImage(); repaint(); Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override protected void paintComponent(java.awt.Graphics g) { super.paintComponent(g); if (image != null) { g.drawImage(image, 0, 0, getWidth(), getHeight(), this); } } public void start() { Thread t = new Thread(this); t.setDaemon(true); t.start(); } public void stop() { webcam.close(); } public static void main(String[] args) throws IOException { WebcamCaptureExample example = new WebcamCaptureExample(); JFrame window = new JFrame("Webcam Capture Example"); window.add(example); window.pack(); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setVisible(true); example.start(); // 保存图片到文件 BufferedImage image = example.image; File file = new File("webcam_capture.png"); ImageIO.write(image, "png", file); example.stop(); } } ``` 该示例程序使用了 [Webcam Capture API](https://github.com/sarxos/webcam-capture) 来获取摄像头图像,需要引入对应的库文件。 程序的主要流程如下: 1. 获取默认摄像头对象并设置摄像头视野大小为640x480。 2. 实现Runnable接口,启动一个线程来获取摄像头图像并通过repaint()方法刷新面板。 3. 实现paintComponent()方法,在面板上绘制摄像头图像。 4. 启动线程,并在主线程中保存最后一帧摄像头图像到文件。 5. 在程序结束时关闭摄像头。 注意:在使用该示例代码之前,请先确保电脑上已经安装了摄像头并且能够正常使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值