Android 外接基于UVC协议的摄像头并实现预览

这篇具有很好参考价值的文章主要介绍了Android 外接基于UVC协议的摄像头并实现预览。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先来一段从网上找到的理论知识,对UVC协议有初步的印象

UVC协议:USB Video Class,USB视频类,是一种为USB视频捕获设备定义的协议标准。

Android 平台支持使用即插即用的 USB 摄像头(即网络摄像头),但前提是这些摄像头采用标准的 Android Camera2 API 和摄像头 HIDL 接口。网络摄像头通常支持 USB 视频类 (UVC) 驱动程序,并且在 Linux 上,系统采用标准的 Video4Linux (V4L) 驱动程序控制 UVC 摄像头。

本文主要展示具体的实现,并不研究UVC协议以及底层实现,只展示Android外界usb摄像头的预览功能的流程。文末附demo

本文的实现基于github开源库:传送门

1.项目中集成libuvccamera模块(代码可从github下载,或者是文末demo中附带)

 implementation project(':libuvccamera')

2.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.serenegiant.widget.AspectRatioSurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

3.MainActivity

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private static final boolean DEBUG = true;
    private ActivityMainBinding binding;
    private UsbDevice mUsbDevice;
    /**
     * CameraHelper是管理Camera服务的客户端
     * (功能包括:选择设备,打开设备,连接设备,关联预览用的CameraView,拍照,录像,断开连接等操作)
     * 其中通过addSurface,关联预览用的Surface比较关键,分为三种情况:
     * a. 连接设备成功时,执行addSurface
     * b. 旋转屏幕,成功进入OnResume时,CameraView生成Surface,并执行回调onSurfaceCreated方法,在方法中执行addSurface
     */
    private ICameraHelper mCameraHelper;
    private final ICameraHelper.StateCallback mStateCallback = new MyCameraHelperCallback();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
    }

    @Override
    public void onStart() {
        super.onStart();
        resetCameraHelper();
    }

    private void resetCameraHelper() {
        clearCameraHelper();
        initCameraHelper();
    }

    public void initCameraHelper() {
        mCameraHelper = new CameraHelper();
        mCameraHelper.setStateCallback(mStateCallback);
    }

    /**
     * 程序结束或者UVC设备断开连接时,释放CameraHelper
     */
    private void clearCameraHelper() {
        if (mCameraHelper != null) {
            mCameraHelper.releaseAll();
            mCameraHelper = null;
        }
    }

    private class MyCameraHelperCallback implements ICameraHelper.StateCallback {
        @Override
        public void onAttach(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onAttach:device=" + device.getDeviceName());
            mCameraHelper.selectDevice(device);
        }

        /**
         * 获取USB设备权限之后,才开始连接USB摄像头
         */
        @Override
        public void onDeviceOpen(UsbDevice device, boolean createNew) {
            if (DEBUG) Log.v(TAG, "onDeviceOpen:device=" + device.getDeviceName());
            if (mCameraHelper != null) {
                mCameraHelper.openCamera();
            }
        }

        @Override
        public void onCameraOpen(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onCameraOpen:");
            mCameraHelper.startPreview();
            // 和摄像头成功建立连接之后,就可以获取摄像头当前预览的实际分辨率
            Size size = mCameraHelper.getPreviewSize();
            if (size != null) {
                // 设置TextureView的宽高比,使之符合摄像头的真实比例
                binding.surfaceView.setAspectRatio(size.width, size.height);
            }
            if (mCameraHelper != null && binding.surfaceView != null && binding.surfaceView.getHolder() != null && binding.surfaceView.getHolder().getSurface() != null) {
                mCameraHelper.addSurface(binding.surfaceView.getHolder().getSurface(), false);
            }
        }

        @Override
        public void onCameraClose(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onCameraClose:");
            if (mCameraHelper != null && binding.surfaceView != null && binding.surfaceView.getHolder() != null && binding.surfaceView.getHolder().getSurface() != null) {
                mCameraHelper.removeSurface(binding.surfaceView.getHolder().getSurface());
            }
        }

        @Override
        public void onDeviceClose(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onDeviceClose:");
        }

        @Override
        public void onDetach(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onDetach:device=" + device.getDeviceName());
            if (device.equals(mUsbDevice)) {
                mUsbDevice = null;
            }
        }

        @Override
        public void onCancel(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onCancel:device=" + device.getDeviceName());
            if (device.equals(mUsbDevice)) {
                mUsbDevice = null;
            }
        }

        @Override
        public void onError(UsbDevice device, CameraException e) {
            if (DEBUG) Log.v(TAG, "onError:" + e);
            if (device.equals(mUsbDevice)) {
                mUsbDevice = null;
            }
        }
    }

}

至此,就实现了对usb摄像头的简单的预览功能

demo源码 文章来源地址https://www.toymoban.com/news/detail-620834.html

到了这里,关于Android 外接基于UVC协议的摄像头并实现预览的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ubuntu调用外接摄像头

    一、ubuntu20.04调用外接摄像头(如果是Ubuntu18.04用melodic放在第二行) 1.检查是否连接摄像头 输出/dev/video0  /dev/video1  /dev/video2  /dev/video3 ...表示可以 2.命令行下载软件调用USB摄像头 2.1使用应用程序camorama 输入命令: 安装完成后,在终端中输入命令: 即可显示出视频信息;

    2024年02月07日
    浏览(28)
  • 使用opencv调用外接摄像头

    当我们使用opencv调用摄像头的命令 cv2.VideoCapture(0),可能会出现下面这个错误。 [ERROR:0@0.433] global obsensor_uvc_stream_channel.cpp:156 cv::obsensor::getStreamChannelGroup Camera index out of range 表明在尝试获取摄像机流通道组时,使用的摄像机索引超出了有效范围。这通常意味着你尝试访问的摄

    2024年02月03日
    浏览(37)
  • ESP32-CAM网络摄像头系列-01-基于RTSP协议的局域网视频推流/拉流的简单实现

            由于项目需要,最近开始开坑关于ESP32-CAM系列的RTSP网络摄像头系列,该文章为该系列的第一篇文章。用于记录项目开发过程。         使用ESP32-CAM获取图像数据,并通过RTSP协议将获取到的视频流传输到上位机进行显示。         使用ESP32-CAM进行视频推流,

    2024年02月11日
    浏览(36)
  • 基于ESP32-CAM的RSTP协议网络摄像头

    开发环境:Arduino。 程序语言:C语言。 ESP32-CAM: ESP32 CAM 产品特性 采用低功耗双核32位CPU,可作应用处理器 主频高达240MHz,运算能力高达 600 DMIPS 内置 520 KB SRAM,外置8MB PSRAM 支持UART/SPI/I2C/PWM/ADC/DAC等接口 支持OV2640和OV7670摄像头,内置闪光灯 支持图片WiFI上传 支持TF卡 支持多

    2024年02月16日
    浏览(29)
  • 基于TCP/IP协议的网络摄像头的QT项目

    目录 项目简述: 1.服务器  步骤一:首先搭建一个基本的服务器框架。  1.初始化服务器的函数主体  2.等待连接 步骤二:数据库的使用,本次项目使用的Sqlite3数据库 1.数据库初始化 2.登录时使用数据库  3.注册时使用数据库 步骤三:摄像头的调用与数据传输 1.V4L2框架的使

    2024年02月03日
    浏览(27)
  • Ubuntu18.04中用ROS驱动外接USB摄像头

    问题描述: 在学习古月居ROS机器人开发实践第7章机器视觉过程中,按照书中的指令驱动USB摄像头打开的是笔记本电脑自带的摄像头,然后网上各种找教程去驱动USB外接的摄像头,终于解决问题,成功驱动外接USB摄像头!   1 首先确定USB摄像头已经连接到电脑的USB接口上。

    2024年02月15日
    浏览(30)
  • DroidCam---将手机转为电脑外接摄像头的软件(提供下载链接)

    在做计算机视觉的项目时,由于电脑自带的摄像头无法活动,会造成识别的相对困难。同时手上也无摄像头设备,那么人手一部的手机就可以尝试成为一个摄像头。 链接:https://pan.baidu.com/s/1_liaLq6zk5YTFq3j_j4ldw  提取码:w1z7 我使用的是window系统,手机是安卓机。电脑和手机都

    2024年02月10日
    浏览(58)
  • 基于android的 rk3399 同时支持多个USB摄像头

    一、前文 在这里插入图片描述 二、CameraHal_Module.h 三、CameraHal_Module.cpp 四、编译烧录Image 该部分的修改要生效的话,需要进行全编译 五、App验证 AndroidManifest.xml MainActivity.java activity_main.xml

    2024年02月08日
    浏览(40)
  • ffmpeg+nginx实现rtsp协议摄像头web端播放

    nginx(需要安装rtmp模块) ffmpeg 6.0 vlc播放器(本地播放验证) 这些资源已经上传需要的可以自己下载,这个压缩包里的nginx已经安装好所需模块,解压即可使用 下载地址 如果你使用的是海康威视得摄像头构成一般为rtsp://摄像头用户名:密码@摄像头IP:摄像头端口/Streaming/Chann

    2024年02月14日
    浏览(30)
  • Android-WebRTC-实现摄像头显示

    EglBase是什么? 它提供了一个接口,用于在Android平台上创建和管理EGL(嵌入式系统图形库)上下文,以便在WebRTC中进行图像和视频的处理和渲染。 Capturer, Source, Track, Sink分别是什么? Capturer(采集器)是指用于采集音频或视频数据的设备或软件。它可以是麦克风、摄像头或其

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包