当前位置: 首页 > article >正文

Android使用UVCCamera打开USBCamera-预览

  1. 导入libuvccamera.aar

  2. 写一个管理类封装UVCCamera相关API

    import android.content.Context
    import android.hardware.usb.UsbDevice
    import android.os.Handler
    import android.os.HandlerThread
    import android.os.Message
    import android.util.Log
    import android.view.Surface
    import com.serenegiant.usb.DeviceFilter
    import com.serenegiant.usb.IFrameCallback
    import com.serenegiant.usb.USBMonitor
    import com.serenegiant.usb.UVCCamera
    import java.nio.ByteBuffer
    
    
    class UsbCameraManager(mContext:Context) :IFrameCallback{
        private val TAG = "UsbCameraManager"
        private var handlerThread = HandlerThread("UsbCameraManager")
        private var usbMonitor:USBMonitor?=null
        private var handler: Handler?=null
        private var uvcCamera:UVCCamera?=null
        private var mPreviewSurface: Surface? = null
        private val OPEN_CAMERA = 1
        init {
            handlerThread.start()
            handler = object : Handler(handlerThread.looper){
                override fun handleMessage(msg: Message) {
                    super.handleMessage(msg)
                    when(msg.what){
                        OPEN_CAMERA->{
                            openCamera(msg.obj as USBMonitor.UsbControlBlock)
                        }
                    }
    
                }
            }
            usbMonitor = USBMonitor(mContext,object :USBMonitor.OnDeviceConnectListener{
                override fun onAttach(device: UsbDevice?) {
                    Log.i(TAG, "onAttach ${device?.deviceId}")
                    val filter = DeviceFilter.getDeviceFilters(mContext, com.serenegiant.uvccamera.R.xml.device_filter)
                    usbMonitor?.let {
                        val devices: List<UsbDevice> = it.getDeviceList(filter[0])
                        if (devices != null && devices.isNotEmpty()) {
                            val cameraDevice = devices[0]
                            it.requestPermission(cameraDevice)
                        } else {
                            Log.i(TAG, "连接失败")
                        }
                    }
                }
    
                override fun onDettach(device: UsbDevice?) {
                    Log.i(TAG, "onDettach ${device?.deviceId}")
                }
    
                override fun onConnect(device: UsbDevice?, ctrlBlock: USBMonitor.UsbControlBlock?, createNew: Boolean) {
                    Log.i(TAG, "onConnect ${device?.deviceId}")
                    ctrlBlock?.let {
                        var message = Message().apply {
                            what = OPEN_CAMERA
                            obj = it
                        }
                        handler?.sendMessage(message)
                    }
                }
    
                override fun onDisconnect(device: UsbDevice?, ctrlBlock: USBMonitor.UsbControlBlock?) {
                    Log.i(TAG, "onDisconnect ${device?.deviceId}")
                    stop()
                }
    
                override fun onCancel(device: UsbDevice?) {
                    Log.i(TAG, "onCancel ${device?.deviceId}")
                    stop()
                }
    
            })
        }
    
        public fun start(mSurface: Surface){
            mPreviewSurface = mSurface
            usbMonitor?.register()
        }
        private fun openCamera(ctrlBlock: USBMonitor.UsbControlBlock){
                if (uvcCamera != null){
                    stop()
                }
                uvcCamera = UVCCamera()
                uvcCamera?.open(ctrlBlock)
                uvcCamera?.setPreviewDisplay(mPreviewSurface)
                uvcCamera?.setPreviewSize(1920,1080)
                uvcCamera?.setFrameCallback(this,UVCCamera.PIXEL_FORMAT_NV21)
                uvcCamera?.startPreview()
        }
    
        override fun onFrame(frame: ByteBuffer?) {
            frame?.let {
                val length = it.capacity()
                it.clear()
                var tmpBuf = ByteArray(length)
                frame[tmpBuf, 0, length]
                Log.i(TAG,"onFrame $frame.length")
            }
        }
        public fun stop(){
            uvcCamera?.stopPreview()
            uvcCamera?.close()
            uvcCamera?.destroy()
            uvcCamera = null
    
        }
    }
    
  3. 添加预览界面

        <TextureView
            android:id="@+id/preview_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
  4. 获取TextureView的Surface,开启预览

    		previewView = findViewById(R.id.preview_view)
            previewView?.surfaceTextureListener = object : TextureView.SurfaceTextureListener {
                override fun onSurfaceTextureAvailable(p0: SurfaceTexture, p1: Int, p2: Int) {
                    val surface = Surface(p0)
                    usbCameraManager?.start(surface)
                }
    
                override fun onSurfaceTextureSizeChanged(p0: SurfaceTexture, p1: Int, p2: Int) {
    
                }
    
                override fun onSurfaceTextureDestroyed(p0: SurfaceTexture): Boolean {
                    return false
                }
    
                override fun onSurfaceTextureUpdated(p0: SurfaceTexture) {
                }
    
            }
            usbCameraManager = UsbCameraManager(mContext)
    

http://www.kler.cn/a/416188.html

相关文章:

  • 安卓-碎片的使用入门
  • 浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite
  • 设计一个基于 LSTM 神经网络的文本分类器
  • 如何利用Java爬虫获取1688关键词接口的深度解析
  • String的设计,用到了哪些设计模式?
  • Window 安装 Nginx
  • JavaScript零基础入门速通(完整)
  • 虚拟机CentOS系统通过Docker部署RSSHub并映射到主机
  • ISO 26262与敏捷SPICE:汽车软件开发的双重指南
  • 网关: 用途和产品对比
  • 【Java基础入门篇】三、面向对象和JVM底层分析(1)
  • 【设计模式】【结构型模式(Structural Patterns)】之适配器模式(Adapter Pattern)
  • CentOS 上安装各种应用的命令行总结
  • Tomcat(39)如何在Tomcat中配置SSL会话缓存?
  • Go语言中高效生成测试文件的方法:实践与优化
  • Gentoo Linux部署LNMP
  • 【数据分析】鞅
  • 微积分复习笔记 Calculus Volume 2 - 3.1
  • 抓包之wireshark基础用法介绍
  • Windows中 qemu虚拟机 安装银河麒麟V10 arm架构系统 服务器版