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

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

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

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

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

简介

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

编辑:玉念聿辉
感谢查阅

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>