Android Camera开发入门(4):USB/UVC Camera的使用

这篇具有很好参考价值的文章主要介绍了Android Camera开发入门(4):USB/UVC Camera的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android Camera开发入门(4):USB/UVC Camera的使用

本文基于开源项目https://github.com/saki4510t/UVCCamera之上进行二次封装和使用

在前几篇文章中,我们介绍了Camera到CameraX的基础功能应用,同时附上了相关代码,需要的源码的大佬们可以滑到最底部获取。

本篇我们一起来了解 USB/UVC 相机是什么以及它们与传统相机的区别,并按照惯例和大家一起来输出代码。

好消息

好多小伙伴私信我说aar的方式不好用,周末特意更新了个版本,主要对日本那个开源库进行优化和去掉一些不必要的功能(如预览延时在500毫秒),同时保留JNI关联代码,熟悉C\C++的小伙伴扩展业务功能就更加方便了。

项目地址:git clone https://gitee.com/yunianvh/usb-camera.git

简介

UVC,全称为USB Video Class,是一种专门为USB视频捕获设备定义的协议标准。它是由Microsoft与其他设备厂商联合推出的,并已成为USB组织的标准之一。

环境

配置项目以支持 USB/UVC 相机。包括添加必要的权限和依赖项。我这里是已经编译好的aar包,懒得自己去编译的大佬们可以直接拿去使用;

	<uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera"/>
    <uses-feature android:name="android.hardware.usb.host"/>
	dependencies {
	    implementation fileTree(include: ['*.jar'], dir: 'libs')
	    implementation(name: 'libusbcommon_v4.1.1', ext: 'aar')
	    implementation(name: 'libusbcamera-v4.1.1', ext: 'aar')
	}

初始化相机

在Activity的onCreate中进行初始化

	<com.serenegiant.usb.widget.UVCCameraTextureView
            android:id="@+id/camera_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"/>
	@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_usbcamera);
		mUVCCameraView = (CameraViewInterface) mTextureView;
        mUVCCameraView.setCallback(this);
        mCameraHelper = UVCCameraHelper.getInstance();
        mCameraHelper.setDefaultFrameFormat(UVCCameraHelper.FRAME_FORMAT_MJPEG);
        mCameraHelper.initUSBMonitor(this, mUVCCameraView, listener);
    }

在onStart和onStop中去注册和销毁

	@Override
    protected void onStart() {
        super.onStart();
        // step.2 register USB event broadcast
        if (mCameraHelper != null) {
            mCameraHelper.registerUSB();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        // step.3 unregister USB event broadcast
        if (mCameraHelper != null) {
            mCameraHelper.unregisterUSB();
        }
    }

相关的回调方法处理代码

	private UVCCameraHelper.OnMyDevConnectListener listener = new UVCCameraHelper.OnMyDevConnectListener() {

        @Override
        public void onAttachDev(UsbDevice device) {
            // request open permission
            if (!isRequest) {
                isRequest = true;
                if (mCameraHelper != null) {
                    mCameraHelper.requestPermission(0);
                }
            }
        }

        @Override
        public void onDettachDev(UsbDevice device) {
            // close camera
            if (isRequest) {
                isRequest = false;
                mCameraHelper.closeCamera();
                showShortMsg(device.getDeviceName() + " is out");
            }
        }

        @Override
        public void onConnectDev(UsbDevice device, boolean isConnected) {
            if (!isConnected) {
                isPreview = false;
            } else {
                isPreview = true;
            }
        }

        @Override
        public void onDisConnectDev(UsbDevice device) {
            showShortMsg("disconnecting");
        }
    };

拍照

在初始化后调用即可

	File picPath = new File(this.getExternalFilesDir(null).getAbsolutePath() + "/"+System.currentTimeMillis()+".jpg");
	mCameraHelper.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() {
                    @Override
                    public void onCaptureResult(String path) {
                       
                    }
     });

视频录制

在初始化后调用即可

	File videoPath = new File(this.getExternalFilesDir(null).getAbsolutePath() + "/"+System.currentTimeMillis()+".mp4");
					RecordParams params = new RecordParams();
                    params.setRecordPath(videoPath);
                    params.setRecordDuration(0);    // auto divide saved,default 0 means not divided
                    params.setVoiceClose(false);    // is close voice
                    mCameraHelper.startPusher(params, new AbstractUVCCameraHandler.OnEncodeResultListener() {
                        @Override
                        public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {
                            // type = 1,h264 video stream
                            // type = 0,aac audio stream
                        }

                        @Override
                        public void onRecordResult(String videoPath) {
                          	//录制完成返回的videoPath
                        }
                    });

总结

由于是人家封装好的项目,没什么好说的,知道怎么使用就是了。个人在实际开发过程中遇到通过帧回调方法获取数据进行编码或者直接调用项目原来录制时候的编码再进行rtmp推流时1080P延时大概在两秒左右。

最后还是通过opengl获取离屏数据的方式获取数据进行编码解决了延时问题。

DOME


该系列文章到这里也就算结束了,后续我将考虑推出更多关于不同版本之间如何添加水印、滤镜以及视频编码等相关功能的简介文章。期待与您分享更多有关相机功能的内容!如果您还有其他问题或需求,请随时告诉我们。谢谢!

gitee:https://gitee.com/yunianvh/camera-demo
github:https://github.com/yunianvh/CameraDemo

编辑:玉念聿辉
感谢查阅文章来源地址https://www.toymoban.com/news/detail-737024.html

到了这里,关于Android Camera开发入门(4):USB/UVC Camera的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Linux内核中的UVC(USB Video Class)驱动

    V4L2(Video for Linux 2)是Linux内核中的视频设备驱动框架,而UVC(USB Video Class)是一种使用USB接口的摄像头设备通信协议。在Linux内核中,V4L2和UVC之间存在以下关系: 1. V4L2支持多种视频设备:V4L2是一个通用的视频设备驱动框架,它旨在支持各种类型的视频设备,包括USB摄像头

    2024年02月08日
    浏览(39)
  • Python OpenCV读取并显示USB UVC摄像头

    1. 安装Python, 略。 2. 安装 OpenCV:         3. 预览摄像头画面脚本:

    2024年02月13日
    浏览(47)
  • FPGA实现USB3.0 UVC 相机HDMI视频输出 基于FT602驱动 提供工程源码和QT上位机源码

    目前USB3.0的实现方案很多,但就简单好用的角度而言,FT601/602应该是最佳方案,因为它电路设计简单,操作时序简单,软件驱动简单,官方甚至提供了包括FPGA驱动在内的丰富的驱动源码和测试软件; 本设计用FPGA驱动FT602芯片实现USB3.0UVC 相机彩条视频输出试验,使用同步245模

    2024年02月03日
    浏览(49)
  • 【android开发-21】android中调用系统摄像头camera拍照和相册的用法详解

    1, 调用摄像头 在Android中,调用系统摄像头拍照需要使用Intent来启动Camera应用,并在应用中设置相应的权限。下面是一个简单的例子:

    2024年02月21日
    浏览(47)
  • Android 之 使用 Camera 拍照

    本节给大家带来的是Android中Camera的使用,简单点说就是拍照咯,无非两种: 1.调用系统自带相机拍照,然后获取拍照后的图片 2.要么自己写个拍照页面 本节我们来写两个简单的例子体验下上面的这两种情况~ 我们只需下面一席话语,即可调用系统相机,相机拍照后会返回一个

    2024年02月09日
    浏览(40)
  • Android之 Camera相机使用

    一 简介 1.1 随着信息时代的发展,相机在我们生活中使用越来越频繁,也成为手机的基本配置之一。相机可以用来拍照,拍视频,人脸识别,视频聊天,扫码支付,监控等常见领域 不管什么场景,基本原理都差不多,都要先通过相机采集原始数据,也就是二进制字节数据,我

    2024年02月15日
    浏览(35)
  • RK3588平台开发系列讲解(USB篇)Linux Android USB软件架构

    平台 内核版本 安卓版本 RK3588 Linux 5.10 Android 12

    2024年02月09日
    浏览(53)
  • android camera系列(Camera1、Camera2、CameraX)的使用以及输出的图像格式

    1.1.1、布局 1.1.2、实现预览 Camera.open() 打开摄像头 setPreviewDisplay 设置预览展示的控件 startPreview 开始预览 发现预览是横着的,需要使用 setDisplayOrientation 调整预览图像的方向 1.1.3、获取摄像头的原始数据 setPreviewCallback 设置预览数据的回调 2560*1440 默认返回图像的分辨率 Image

    2024年02月21日
    浏览(51)
  • 【Android取证篇】Android设备USB调试打开方式(开发者模式)

    Android各个版本系统手机开启”USB调试”的入口不全相同,仅供参考—【蘇小沐】 1、【Android1.0-3.2】 路径:在应用列表选择「设置」-「应用程序」-「开发」-勾选「USB调试」选项。 2、【Android 4.0、4.1】 路径:在应用程序列表中选择「设置」进入系统设置菜单-「开发者选项」

    2024年02月14日
    浏览(50)
  • Android流媒体开发之路一:Camera2采集摄像头数据并手动预览

    最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在TextureView等预览基础上实现,而我想要做的是在不预览的情况下,能获取到摄像头原始数据流,并由自己来决定是否绘制显示。经过一番折腾,初步实现了自己

    2024年02月16日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包